t_ptrace_wait.c revision 1.37
1/*	$NetBSD: t_ptrace_wait.c,v 1.37 2018/04/29 13:56:00 kamil Exp $	*/
2
3/*-
4 * Copyright (c) 2016 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <sys/cdefs.h>
30__RCSID("$NetBSD: t_ptrace_wait.c,v 1.37 2018/04/29 13:56:00 kamil Exp $");
31
32#include <sys/param.h>
33#include <sys/types.h>
34#include <sys/ptrace.h>
35#include <sys/resource.h>
36#include <sys/stat.h>
37#include <sys/syscall.h>
38#include <sys/sysctl.h>
39#include <sys/wait.h>
40#include <machine/reg.h>
41#include <elf.h>
42#include <err.h>
43#include <errno.h>
44#include <lwp.h>
45#include <sched.h>
46#include <signal.h>
47#include <stdint.h>
48#include <stdio.h>
49#include <stdlib.h>
50#include <strings.h>
51#include <time.h>
52#include <unistd.h>
53
54#include <atf-c.h>
55
56#include "h_macros.h"
57
58#include "t_ptrace_wait.h"
59#include "msg.h"
60
61#define PARENT_TO_CHILD(info, fds, msg) \
62    SYSCALL_REQUIRE(msg_write_child(info " to child " # fds, &fds, &msg, sizeof(msg)) == 0)
63
64#define CHILD_FROM_PARENT(info, fds, msg) \
65    FORKEE_ASSERT(msg_read_parent(info " from parent " # fds, &fds, &msg, sizeof(msg)) == 0)
66
67#define CHILD_TO_PARENT(info, fds, msg) \
68    FORKEE_ASSERT(msg_write_parent(info " to parent " # fds, &fds, &msg, sizeof(msg)) == 0)
69
70#define PARENT_FROM_CHILD(info, fds, msg) \
71    SYSCALL_REQUIRE(msg_read_child(info " from parent " # fds, &fds, &msg, sizeof(msg)) == 0)
72
73#define SYSCALL_REQUIRE(expr) ATF_REQUIRE_MSG(expr, "%s: %s", # expr, \
74    strerror(errno))
75#define SYSCALL_REQUIRE_ERRNO(res, exp) ATF_REQUIRE_MSG(res == exp, \
76    "%d(%s) != %d", res, strerror(res), exp)
77
78static int debug = 0;
79
80#define DPRINTF(a, ...)	do  \
81	if (debug) printf(a,  ##__VA_ARGS__); \
82    while (/*CONSTCOND*/0)
83
84/// ----------------------------------------------------------------------------
85
86static void
87traceme_raise(int sigval)
88{
89	const int exitval = 5;
90	pid_t child, wpid;
91#if defined(TWAIT_HAVE_STATUS)
92	int status;
93#endif
94
95	DPRINTF("Before forking process PID=%d\n", getpid());
96	SYSCALL_REQUIRE((child = fork()) != -1);
97	if (child == 0) {
98		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
99		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
100
101		DPRINTF("Before raising %s from child\n", strsignal(sigval));
102		FORKEE_ASSERT(raise(sigval) == 0);
103
104		switch (sigval) {
105		case SIGKILL:
106			/* NOTREACHED */
107			FORKEE_ASSERTX(0 && "This shall not be reached");
108		default:
109			DPRINTF("Before exiting of the child process\n");
110			_exit(exitval);
111		}
112	}
113	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
114
115	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
116	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
117
118	switch (sigval) {
119	case SIGKILL:
120		validate_status_signaled(status, sigval, 0);
121		break;
122	default:
123		validate_status_stopped(status, sigval);
124
125		DPRINTF("Before resuming the child process where it left off "
126		    "and without signal to be sent\n");
127		SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
128
129		DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
130		TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0),
131		                      child);
132		break;
133	}
134
135	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
136	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
137}
138
139#define TRACEME_RAISE(test, sig)						\
140ATF_TC(test);									\
141ATF_TC_HEAD(test, tc)								\
142{										\
143	atf_tc_set_md_var(tc, "descr",						\
144	    "Verify " #sig " followed by _exit(2) in a child");			\
145}										\
146										\
147ATF_TC_BODY(test, tc)								\
148{										\
149										\
150	traceme_raise(sig);							\
151}
152
153TRACEME_RAISE(traceme_raise1, SIGKILL) /* non-maskable */
154TRACEME_RAISE(traceme_raise2, SIGSTOP) /* non-maskable */
155TRACEME_RAISE(traceme_raise3, SIGABRT) /* regular abort trap */
156TRACEME_RAISE(traceme_raise4, SIGHUP)  /* hangup */
157TRACEME_RAISE(traceme_raise5, SIGCONT) /* continued? */
158
159/// ----------------------------------------------------------------------------
160
161static void
162traceme_sighandler_catch(int sigsent, void (*sah)(int arg), int *traceme_caught)
163{
164	const int exitval = 5;
165	const int sigval = SIGSTOP;
166	pid_t child, wpid;
167	struct sigaction sa;
168#if defined(TWAIT_HAVE_STATUS)
169	int status;
170#endif
171
172	DPRINTF("Before forking process PID=%d\n", getpid());
173	SYSCALL_REQUIRE((child = fork()) != -1);
174	if (child == 0) {
175		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
176		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
177
178		sa.sa_handler = sah;
179		sa.sa_flags = SA_SIGINFO;
180		sigemptyset(&sa.sa_mask);
181
182		FORKEE_ASSERT(sigaction(sigsent, &sa, NULL) != -1);
183
184		DPRINTF("Before raising %s from child\n", strsignal(sigval));
185		FORKEE_ASSERT(raise(sigval) == 0);
186
187		FORKEE_ASSERT_EQ(*traceme_caught, 1);
188
189		DPRINTF("Before exiting of the child process\n");
190		_exit(exitval);
191	}
192	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
193
194	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
195	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
196
197	validate_status_stopped(status, sigval);
198
199	DPRINTF("Before resuming the child process where it left off and with "
200	    "signal %s to be sent\n", strsignal(sigsent));
201	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, sigsent) != -1);
202
203	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
204	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
205
206	validate_status_exited(status, exitval);
207
208	DPRINTF("Before calling %s() for the exited child\n", TWAIT_FNAME);
209	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
210}
211
212#define TRACEME_SIGHANDLER_CATCH(test, sig)					\
213ATF_TC(test);									\
214ATF_TC_HEAD(test, tc)								\
215{										\
216	atf_tc_set_md_var(tc, "descr",						\
217	    "Verify that a signal " #sig " emitted by a tracer to a child is "	\
218	    "handled correctly and caught by a signal handler");		\
219}										\
220										\
221static int test##_caught = 0;							\
222										\
223static void									\
224test##_sighandler(int arg)							\
225{										\
226	FORKEE_ASSERT_EQ(arg, sig);						\
227										\
228	++ test##_caught;							\
229}										\
230										\
231ATF_TC_BODY(test, tc)								\
232{										\
233										\
234	traceme_sighandler_catch(sig, test##_sighandler, & test##_caught);	\
235}
236
237// A signal handler for SIGKILL and SIGSTOP cannot be registered.
238TRACEME_SIGHANDLER_CATCH(traceme_sighandler_catch1, SIGABRT) /* abort trap */
239TRACEME_SIGHANDLER_CATCH(traceme_sighandler_catch2, SIGHUP)  /* hangup */
240TRACEME_SIGHANDLER_CATCH(traceme_sighandler_catch3, SIGCONT) /* continued? */
241
242/// ----------------------------------------------------------------------------
243
244static void
245traceme_signal_nohandler(int sigsent)
246{
247	const int sigval = SIGSTOP;
248	int exitval = 0;
249	pid_t child, wpid;
250#if defined(TWAIT_HAVE_STATUS)
251	int status;
252	int expect_core = (sigsent == SIGABRT) ? 1 : 0;
253#endif
254
255	DPRINTF("Before forking process PID=%d\n", getpid());
256	SYSCALL_REQUIRE((child = fork()) != -1);
257	if (child == 0) {
258		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
259		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
260
261		DPRINTF("Before raising %s from child\n", strsignal(sigval));
262		FORKEE_ASSERT(raise(sigval) == 0);
263
264		switch (sigsent) {
265		case SIGCONT:
266			_exit(exitval);
267		default:
268			/* NOTREACHED */
269			FORKEE_ASSERTX(0 && "This shall not be reached");
270		}
271	}
272	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
273
274	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
275	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
276
277	validate_status_stopped(status, sigval);
278
279	DPRINTF("Before resuming the child process where it left off and with "
280	    "signal %s to be sent\n", strsignal(sigsent));
281	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, sigsent) != -1);
282
283	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
284	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
285
286	switch (sigsent) {
287	case SIGCONT:
288		validate_status_exited(status, exitval);
289		break;
290	default:
291		validate_status_signaled(status, sigsent, expect_core);
292		break;
293	}
294
295	DPRINTF("Before calling %s() for the exited child\n", TWAIT_FNAME);
296	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
297}
298
299#define TRACEME_SIGNAL_NOHANDLER(test, sig)					\
300ATF_TC(test);									\
301ATF_TC_HEAD(test, tc)								\
302{										\
303	atf_tc_set_md_var(tc, "descr",						\
304	    "Verify that a signal " #sig " emitted by a tracer to a child is "	\
305	    "handled correctly in a child without a signal handler");		\
306}										\
307										\
308ATF_TC_BODY(test, tc)								\
309{										\
310										\
311	traceme_signal_nohandler(sig);						\
312}
313
314TRACEME_SIGNAL_NOHANDLER(traceme_signal_nohandler1, SIGKILL) /* non-maskable */
315//TRACEME_SIGNAL_NOHANDLER(traceme_signal_nohandler2, SIGSTOP) /* non-maskable */
316TRACEME_SIGNAL_NOHANDLER(traceme_signal_nohandler3, SIGABRT) /* abort trap */
317TRACEME_SIGNAL_NOHANDLER(traceme_signal_nohandler4, SIGHUP)  /* hangup */
318TRACEME_SIGNAL_NOHANDLER(traceme_signal_nohandler5, SIGCONT) /* continued? */
319
320/// ----------------------------------------------------------------------------
321
322ATF_TC(traceme_pid1_parent);
323ATF_TC_HEAD(traceme_pid1_parent, tc)
324{
325	atf_tc_set_md_var(tc, "descr",
326	    "Verify that PT_TRACE_ME is not allowed when our parent is PID1");
327}
328
329ATF_TC_BODY(traceme_pid1_parent, tc)
330{
331	struct msg_fds parent_child;
332	int exitval_child1 = 1, exitval_child2 = 2;
333	pid_t child1, child2, wpid;
334	uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */
335#if defined(TWAIT_HAVE_STATUS)
336	int status;
337#endif
338
339	SYSCALL_REQUIRE(msg_open(&parent_child) == 0);
340
341	DPRINTF("Before forking process PID=%d\n", getpid());
342	SYSCALL_REQUIRE((child1 = fork()) != -1);
343	if (child1 == 0) {
344		DPRINTF("Before forking process PID=%d\n", getpid());
345		SYSCALL_REQUIRE((child2 = fork()) != -1);
346		if (child2 != 0) {
347			DPRINTF("Parent process PID=%d, child2's PID=%d\n",
348			        getpid(), child2);
349			_exit(exitval_child1);
350		}
351		CHILD_FROM_PARENT("exit child1", parent_child, msg);
352
353		DPRINTF("Assert that our parent is PID1 (initproc)\n");
354		FORKEE_ASSERT_EQ(getppid(), 1);
355
356		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
357		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) == -1);
358		SYSCALL_REQUIRE_ERRNO(errno, EPERM);
359
360		CHILD_TO_PARENT("child2 exiting", parent_child, msg);
361
362		_exit(exitval_child2);
363	}
364	DPRINTF("Parent process PID=%d, child1's PID=%d\n", getpid(), child1);
365
366	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
367	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child1, &status, WEXITED),
368	                      child1);
369
370	validate_status_exited(status, exitval_child1);
371
372	DPRINTF("Notify that child1 is dead\n");
373	PARENT_TO_CHILD("exit child1", parent_child, msg);
374
375	DPRINTF("Wait for exiting of child2\n");
376	PARENT_FROM_CHILD("child2 exiting", parent_child, msg);
377}
378
379/// ----------------------------------------------------------------------------
380
381#if defined(TWAIT_HAVE_PID)
382ATF_TC(attach1);
383ATF_TC_HEAD(attach1, tc)
384{
385	atf_tc_set_md_var(tc, "descr",
386	    "Assert that tracer sees process termination before the parent");
387}
388
389static void
390attach1_raw(bool raw)
391{
392	struct msg_fds parent_tracee, parent_tracer;
393	const int exitval_tracee = 5;
394	const int exitval_tracer = 10;
395	pid_t tracee, tracer, wpid;
396	uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */
397#if defined(TWAIT_HAVE_STATUS)
398	int status;
399#endif
400
401	DPRINTF("Spawn tracee\n");
402	SYSCALL_REQUIRE(msg_open(&parent_tracee) == 0);
403	tracee = atf_utils_fork();
404	if (tracee == 0) {
405		// Wait for parent to let us exit
406		CHILD_FROM_PARENT("exit tracee", parent_tracee, msg);
407		_exit(exitval_tracee);
408	}
409
410	DPRINTF("Spawn debugger\n");
411	SYSCALL_REQUIRE(msg_open(&parent_tracer) == 0);
412	tracer = atf_utils_fork();
413	if (tracer == 0) {
414		DPRINTF("Before calling PT_ATTACH from tracee %d\n", getpid());
415		FORKEE_ASSERT(ptrace(PT_ATTACH, tracee, NULL, 0) != -1);
416
417		/* Wait for tracee and assert that it was stopped w/ SIGSTOP */
418		FORKEE_REQUIRE_SUCCESS(
419		    wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
420
421		forkee_status_stopped(status, SIGSTOP);
422
423		/* Resume tracee with PT_CONTINUE */
424		FORKEE_ASSERT(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1);
425
426		/* Inform parent that tracer has attached to tracee */
427		CHILD_TO_PARENT("tracer ready", parent_tracer, msg);
428
429		/* Wait for parent to tell use that tracee should have exited */
430		CHILD_FROM_PARENT("wait for tracee exit", parent_tracer, msg);
431
432		/* Wait for tracee and assert that it exited */
433		FORKEE_REQUIRE_SUCCESS(
434		    wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
435
436		forkee_status_exited(status, exitval_tracee);
437		DPRINTF("Tracee %d exited with %d\n", tracee, exitval_tracee);
438
439		DPRINTF("Before exiting of the tracer process\n");
440		_exit(exitval_tracer);
441	}
442
443	DPRINTF("Wait for the tracer to attach to the tracee\n");
444	PARENT_FROM_CHILD("tracer ready", parent_tracer, msg);
445
446	DPRINTF("Resume the tracee and let it exit\n");
447	PARENT_TO_CHILD("exit tracee", parent_tracee,  msg);
448
449	DPRINTF("Detect that tracee is zombie\n");
450	if (raw)
451		await_zombie_raw(tracee, 0);
452	else
453		await_zombie(tracee);
454
455	DPRINTF("Assert that there is no status about tracee %d - "
456	    "Tracer must detect zombie first - calling %s()\n", tracee,
457	    TWAIT_FNAME);
458	TWAIT_REQUIRE_SUCCESS(
459	    wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 0);
460
461	DPRINTF("Tell the tracer child should have exited\n");
462	PARENT_TO_CHILD("wait for tracee exit", parent_tracer,  msg);
463	DPRINTF("Wait for tracer to finish its job and exit - calling %s()\n",
464	    TWAIT_FNAME);
465
466	DPRINTF("Wait from tracer child to complete waiting for tracee\n");
467	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracer, &status, 0),
468	    tracer);
469
470	validate_status_exited(status, exitval_tracer);
471
472	DPRINTF("Wait for tracee to finish its job and exit - calling %s()\n",
473	    TWAIT_FNAME);
474	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracee, &status, WNOHANG),
475	    tracee);
476
477	validate_status_exited(status, exitval_tracee);
478
479	msg_close(&parent_tracer);
480	msg_close(&parent_tracee);
481}
482
483ATF_TC_BODY(attach1, tc)
484{
485
486	/* Reuse this test with race1 */
487	attach1_raw(false);
488}
489
490#endif
491
492#if defined(TWAIT_HAVE_PID)
493ATF_TC(attach2);
494ATF_TC_HEAD(attach2, tc)
495{
496	atf_tc_set_md_var(tc, "descr",
497	    "Assert that any tracer sees process termination before its "
498	    "parent");
499}
500
501ATF_TC_BODY(attach2, tc)
502{
503	struct msg_fds parent_tracer, parent_tracee;
504	const int exitval_tracee = 5;
505	const int exitval_tracer1 = 10, exitval_tracer2 = 20;
506	pid_t tracee, tracer, wpid;
507	uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */
508#if defined(TWAIT_HAVE_STATUS)
509	int status;
510#endif
511
512	DPRINTF("Spawn tracee\n");
513	SYSCALL_REQUIRE(msg_open(&parent_tracee) == 0);
514	tracee = atf_utils_fork();
515	if (tracee == 0) {
516		/* Wait for message from the parent */
517		CHILD_FROM_PARENT("Message 1", parent_tracee, msg);
518		_exit(exitval_tracee);
519	}
520
521	DPRINTF("Spawn debugger\n");
522	SYSCALL_REQUIRE(msg_open(&parent_tracer) == 0);
523	tracer = atf_utils_fork();
524	if (tracer == 0) {
525		/* Fork again and drop parent to reattach to PID 1 */
526		tracer = atf_utils_fork();
527		if (tracer != 0)
528			_exit(exitval_tracer1);
529
530		DPRINTF("Before calling PT_ATTACH from tracee %d\n", getpid());
531		FORKEE_ASSERT(ptrace(PT_ATTACH, tracee, NULL, 0) != -1);
532
533		/* Wait for tracee and assert that it was stopped w/ SIGSTOP */
534		FORKEE_REQUIRE_SUCCESS(
535		    wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
536
537		forkee_status_stopped(status, SIGSTOP);
538
539		/* Resume tracee with PT_CONTINUE */
540		FORKEE_ASSERT(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1);
541
542		/* Inform parent that tracer has attached to tracee */
543		CHILD_TO_PARENT("Message 1", parent_tracer, msg);
544		CHILD_FROM_PARENT("Message 2", parent_tracer, msg);
545
546		/* Wait for tracee and assert that it exited */
547		FORKEE_REQUIRE_SUCCESS(
548		    wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
549
550		forkee_status_exited(status, exitval_tracee);
551
552		DPRINTF("Before exiting of the tracer process\n");
553		_exit(exitval_tracer2);
554	}
555	DPRINTF("Wait for the tracer process (direct child) to exit calling "
556	    "%s()\n", TWAIT_FNAME);
557	TWAIT_REQUIRE_SUCCESS(
558	    wpid = TWAIT_GENERIC(tracer, &status, 0), tracer);
559
560	validate_status_exited(status, exitval_tracer1);
561
562	DPRINTF("Wait for the non-exited tracee process with %s()\n",
563	    TWAIT_FNAME);
564	TWAIT_REQUIRE_SUCCESS(
565	    wpid = TWAIT_GENERIC(tracee, NULL, WNOHANG), 0);
566
567	DPRINTF("Wait for the tracer to attach to the tracee\n");
568	PARENT_FROM_CHILD("Message 1", parent_tracer, msg);
569	DPRINTF("Resume the tracee and let it exit\n");
570	PARENT_TO_CHILD("Message 1", parent_tracee, msg);
571
572	DPRINTF("Detect that tracee is zombie\n");
573	await_zombie(tracee);
574
575	DPRINTF("Assert that there is no status about tracee - "
576	    "Tracer must detect zombie first - calling %s()\n", TWAIT_FNAME);
577	TWAIT_REQUIRE_SUCCESS(
578	    wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 0);
579
580	DPRINTF("Resume the tracer and let it detect exited tracee\n");
581	PARENT_TO_CHILD("Message 2", parent_tracer, msg);
582
583	DPRINTF("Wait for tracee to finish its job and exit - calling %s()\n",
584	    TWAIT_FNAME);
585	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracee, &status, 0),
586	    tracee);
587
588	validate_status_exited(status, exitval_tracee);
589
590	msg_close(&parent_tracer);
591	msg_close(&parent_tracee);
592}
593#endif
594
595ATF_TC(attach3);
596ATF_TC_HEAD(attach3, tc)
597{
598	atf_tc_set_md_var(tc, "descr",
599	    "Assert that tracer parent can PT_ATTACH to its child");
600}
601
602ATF_TC_BODY(attach3, tc)
603{
604	struct msg_fds parent_tracee;
605	const int exitval_tracee = 5;
606	pid_t tracee, wpid;
607	uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */
608#if defined(TWAIT_HAVE_STATUS)
609	int status;
610#endif
611
612	DPRINTF("Spawn tracee\n");
613	SYSCALL_REQUIRE(msg_open(&parent_tracee) == 0);
614	tracee = atf_utils_fork();
615	if (tracee == 0) {
616		CHILD_FROM_PARENT("Message 1", parent_tracee, msg);
617		DPRINTF("Parent should now attach to tracee\n");
618
619		CHILD_FROM_PARENT("Message 2", parent_tracee, msg);
620		/* Wait for message from the parent */
621		_exit(exitval_tracee);
622	}
623	PARENT_TO_CHILD("Message 1", parent_tracee, msg);
624
625	DPRINTF("Before calling PT_ATTACH for tracee %d\n", tracee);
626	SYSCALL_REQUIRE(ptrace(PT_ATTACH, tracee, NULL, 0) != -1);
627
628	DPRINTF("Wait for the stopped tracee process with %s()\n",
629	    TWAIT_FNAME);
630	TWAIT_REQUIRE_SUCCESS(
631	    wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
632
633	validate_status_stopped(status, SIGSTOP);
634
635	DPRINTF("Resume tracee with PT_CONTINUE\n");
636	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1);
637
638	DPRINTF("Let the tracee exit now\n");
639	PARENT_TO_CHILD("Message 2", parent_tracee, msg);
640
641	DPRINTF("Wait for tracee to exit with %s()\n", TWAIT_FNAME);
642	TWAIT_REQUIRE_SUCCESS(
643	    wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
644
645	validate_status_exited(status, exitval_tracee);
646
647	DPRINTF("Before calling %s() for tracee\n", TWAIT_FNAME);
648	TWAIT_REQUIRE_FAILURE(ECHILD,
649	    wpid = TWAIT_GENERIC(tracee, &status, 0));
650
651	msg_close(&parent_tracee);
652}
653
654ATF_TC(attach4);
655ATF_TC_HEAD(attach4, tc)
656{
657	atf_tc_set_md_var(tc, "descr",
658	    "Assert that tracer child can PT_ATTACH to its parent");
659}
660
661ATF_TC_BODY(attach4, tc)
662{
663	struct msg_fds parent_tracee;
664	const int exitval_tracer = 5;
665	pid_t tracer, wpid;
666	uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */
667#if defined(TWAIT_HAVE_STATUS)
668	int status;
669#endif
670
671	DPRINTF("Spawn tracer\n");
672	SYSCALL_REQUIRE(msg_open(&parent_tracee) == 0);
673	tracer = atf_utils_fork();
674	if (tracer == 0) {
675
676		/* Wait for message from the parent */
677		CHILD_FROM_PARENT("Message 1", parent_tracee, msg);
678
679		DPRINTF("Attach to parent PID %d with PT_ATTACH from child\n",
680		    getppid());
681		FORKEE_ASSERT(ptrace(PT_ATTACH, getppid(), NULL, 0) != -1);
682
683		DPRINTF("Wait for the stopped parent process with %s()\n",
684		    TWAIT_FNAME);
685		FORKEE_REQUIRE_SUCCESS(
686		    wpid = TWAIT_GENERIC(getppid(), &status, 0), getppid());
687
688		forkee_status_stopped(status, SIGSTOP);
689
690		DPRINTF("Resume parent with PT_DETACH\n");
691		FORKEE_ASSERT(ptrace(PT_DETACH, getppid(), (void *)1, 0)
692		    != -1);
693
694		/* Tell parent we are ready */
695		CHILD_TO_PARENT("Message 1", parent_tracee, msg);
696
697		_exit(exitval_tracer);
698	}
699
700	DPRINTF("Wait for the tracer to become ready\n");
701	PARENT_TO_CHILD("Message 1", parent_tracee, msg);
702	DPRINTF("Allow the tracer to exit now\n");
703	PARENT_FROM_CHILD("Message 1", parent_tracee, msg);
704
705	DPRINTF("Wait for tracer to exit with %s()\n", TWAIT_FNAME);
706	TWAIT_REQUIRE_SUCCESS(
707	    wpid = TWAIT_GENERIC(tracer, &status, 0), tracer);
708
709	validate_status_exited(status, exitval_tracer);
710
711	DPRINTF("Before calling %s() for tracer\n", TWAIT_FNAME);
712	TWAIT_REQUIRE_FAILURE(ECHILD,
713	    wpid = TWAIT_GENERIC(tracer, &status, 0));
714
715	msg_close(&parent_tracee);
716}
717
718#if defined(TWAIT_HAVE_PID)
719ATF_TC(attach5);
720ATF_TC_HEAD(attach5, tc)
721{
722	atf_tc_set_md_var(tc, "descr",
723	    "Assert that tracer sees its parent when attached to tracer "
724	    "(check getppid(2))");
725}
726
727ATF_TC_BODY(attach5, tc)
728{
729	struct msg_fds parent_tracer, parent_tracee;
730	const int exitval_tracee = 5;
731	const int exitval_tracer = 10;
732	pid_t parent, tracee, tracer, wpid;
733	uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */
734#if defined(TWAIT_HAVE_STATUS)
735	int status;
736#endif
737
738	DPRINTF("Spawn tracee\n");
739	SYSCALL_REQUIRE(msg_open(&parent_tracer) == 0);
740	SYSCALL_REQUIRE(msg_open(&parent_tracee) == 0);
741	tracee = atf_utils_fork();
742	if (tracee == 0) {
743		parent = getppid();
744
745		/* Emit message to the parent */
746		CHILD_TO_PARENT("tracee ready", parent_tracee, msg);
747		CHILD_FROM_PARENT("exit tracee", parent_tracee, msg);
748
749		FORKEE_ASSERT_EQ(parent, getppid());
750
751		_exit(exitval_tracee);
752	}
753	DPRINTF("Wait for child to record its parent identifier (pid)\n");
754	PARENT_FROM_CHILD("tracee ready", parent_tracee, msg);
755
756	DPRINTF("Spawn debugger\n");
757	tracer = atf_utils_fork();
758	if (tracer == 0) {
759		/* No IPC to communicate with the child */
760		DPRINTF("Before calling PT_ATTACH from tracee %d\n", getpid());
761		FORKEE_ASSERT(ptrace(PT_ATTACH, tracee, NULL, 0) != -1);
762
763		/* Wait for tracee and assert that it was stopped w/ SIGSTOP */
764		FORKEE_REQUIRE_SUCCESS(
765		    wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
766
767		forkee_status_stopped(status, SIGSTOP);
768
769		/* Resume tracee with PT_CONTINUE */
770		FORKEE_ASSERT(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1);
771
772		/* Inform parent that tracer has attached to tracee */
773		CHILD_TO_PARENT("tracer ready", parent_tracer, msg);
774
775		/* Wait for parent to tell use that tracee should have exited */
776		CHILD_FROM_PARENT("wait for tracee exit", parent_tracer, msg);
777
778		/* Wait for tracee and assert that it exited */
779		FORKEE_REQUIRE_SUCCESS(
780		    wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
781
782		forkee_status_exited(status, exitval_tracee);
783
784		DPRINTF("Before exiting of the tracer process\n");
785		_exit(exitval_tracer);
786	}
787
788	DPRINTF("Wait for the tracer to attach to the tracee\n");
789	PARENT_FROM_CHILD("tracer ready",  parent_tracer, msg);
790
791	DPRINTF("Resume the tracee and let it exit\n");
792	PARENT_TO_CHILD("exit tracee",  parent_tracee, msg);
793
794	DPRINTF("Detect that tracee is zombie\n");
795	await_zombie(tracee);
796
797	DPRINTF("Assert that there is no status about tracee - "
798	    "Tracer must detect zombie first - calling %s()\n", TWAIT_FNAME);
799	TWAIT_REQUIRE_SUCCESS(
800	    wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 0);
801
802	DPRINTF("Tell the tracer child should have exited\n");
803	PARENT_TO_CHILD("wait for tracee exit",  parent_tracer, msg);
804
805	DPRINTF("Wait from tracer child to complete waiting for tracee\n");
806	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracer, &status, 0),
807	    tracer);
808
809	validate_status_exited(status, exitval_tracer);
810
811	DPRINTF("Wait for tracee to finish its job and exit - calling %s()\n",
812	    TWAIT_FNAME);
813	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracee, &status, WNOHANG),
814	    tracee);
815
816	validate_status_exited(status, exitval_tracee);
817
818	msg_close(&parent_tracer);
819	msg_close(&parent_tracee);
820}
821#endif
822
823#if defined(TWAIT_HAVE_PID)
824ATF_TC(attach6);
825ATF_TC_HEAD(attach6, tc)
826{
827	atf_tc_set_md_var(tc, "descr",
828	    "Assert that tracer sees its parent when attached to tracer "
829	    "(check sysctl(7) and struct kinfo_proc2)");
830}
831
832ATF_TC_BODY(attach6, tc)
833{
834	struct msg_fds parent_tracee, parent_tracer;
835	const int exitval_tracee = 5;
836	const int exitval_tracer = 10;
837	pid_t parent, tracee, tracer, wpid;
838	uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */
839#if defined(TWAIT_HAVE_STATUS)
840	int status;
841#endif
842	int name[CTL_MAXNAME];
843	struct kinfo_proc2 kp;
844	size_t len = sizeof(kp);
845	unsigned int namelen;
846
847	DPRINTF("Spawn tracee\n");
848	SYSCALL_REQUIRE(msg_open(&parent_tracee) == 0);
849	SYSCALL_REQUIRE(msg_open(&parent_tracer) == 0);
850	tracee = atf_utils_fork();
851	if (tracee == 0) {
852		parent = getppid();
853
854		/* Emit message to the parent */
855		CHILD_TO_PARENT("Message 1", parent_tracee, msg);
856		CHILD_FROM_PARENT("Message 2", parent_tracee, msg);
857
858		namelen = 0;
859		name[namelen++] = CTL_KERN;
860		name[namelen++] = KERN_PROC2;
861		name[namelen++] = KERN_PROC_PID;
862		name[namelen++] = getpid();
863		name[namelen++] = len;
864		name[namelen++] = 1;
865
866		FORKEE_ASSERT(sysctl(name, namelen, &kp, &len, NULL, 0) == 0);
867		FORKEE_ASSERT_EQ(parent, kp.p_ppid);
868
869		_exit(exitval_tracee);
870	}
871
872	DPRINTF("Wait for child to record its parent identifier (pid)\n");
873	PARENT_FROM_CHILD("Message 1", parent_tracee, msg);
874
875	DPRINTF("Spawn debugger\n");
876	tracer = atf_utils_fork();
877	if (tracer == 0) {
878		/* No IPC to communicate with the child */
879		DPRINTF("Before calling PT_ATTACH from tracee %d\n", getpid());
880		FORKEE_ASSERT(ptrace(PT_ATTACH, tracee, NULL, 0) != -1);
881
882		/* Wait for tracee and assert that it was stopped w/ SIGSTOP */
883		FORKEE_REQUIRE_SUCCESS(
884		    wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
885
886		forkee_status_stopped(status, SIGSTOP);
887
888		/* Resume tracee with PT_CONTINUE */
889		FORKEE_ASSERT(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1);
890
891		/* Inform parent that tracer has attached to tracee */
892		CHILD_TO_PARENT("Message 1", parent_tracer, msg);
893
894		CHILD_FROM_PARENT("Message 2", parent_tracer, msg);
895
896		/* Wait for tracee and assert that it exited */
897		FORKEE_REQUIRE_SUCCESS(
898		    wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
899
900		forkee_status_exited(status, exitval_tracee);
901
902		DPRINTF("Before exiting of the tracer process\n");
903		_exit(exitval_tracer);
904	}
905
906	DPRINTF("Wait for the tracer to attach to the tracee\n");
907	PARENT_FROM_CHILD("Message 1", parent_tracer, msg);
908
909	DPRINTF("Resume the tracee and let it exit\n");
910	PARENT_TO_CHILD("Message 1", parent_tracee, msg);
911
912	DPRINTF("Detect that tracee is zombie\n");
913	await_zombie(tracee);
914
915	DPRINTF("Assert that there is no status about tracee - "
916	    "Tracer must detect zombie first - calling %s()\n", TWAIT_FNAME);
917	TWAIT_REQUIRE_SUCCESS(
918	    wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 0);
919
920	DPRINTF("Resume the tracer and let it detect exited tracee\n");
921	PARENT_TO_CHILD("Message 2", parent_tracer, msg);
922
923	DPRINTF("Wait for tracer to finish its job and exit - calling %s()\n",
924	    TWAIT_FNAME);
925	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracer, &status, 0),
926	    tracer);
927
928	validate_status_exited(status, exitval_tracer);
929
930	DPRINTF("Wait for tracee to finish its job and exit - calling %s()\n",
931	    TWAIT_FNAME);
932	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracee, &status, WNOHANG),
933	    tracee);
934
935	validate_status_exited(status, exitval_tracee);
936
937	msg_close(&parent_tracee);
938	msg_close(&parent_tracer);
939}
940#endif
941
942#if defined(TWAIT_HAVE_PID)
943ATF_TC(attach7);
944ATF_TC_HEAD(attach7, tc)
945{
946	atf_tc_set_md_var(tc, "descr",
947	    "Assert that tracer sees its parent when attached to tracer "
948	    "(check /proc/curproc/status 3rd column)");
949}
950
951ATF_TC_BODY(attach7, tc)
952{
953	struct msg_fds parent_tracee, parent_tracer;
954	int rv;
955	const int exitval_tracee = 5;
956	const int exitval_tracer = 10;
957	pid_t parent, tracee, tracer, wpid;
958	uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */
959#if defined(TWAIT_HAVE_STATUS)
960	int status;
961#endif
962	FILE *fp;
963	struct stat st;
964	const char *fname = "/proc/curproc/status";
965	char s_executable[MAXPATHLEN];
966	int s_pid, s_ppid;
967	/*
968	 * Format:
969	 *  EXECUTABLE PID PPID ...
970	 */
971
972	SYSCALL_REQUIRE((rv = stat(fname, &st)) == 0 || (errno == ENOENT));
973	if (rv != 0) {
974		atf_tc_skip("/proc/curproc/status not found");
975	}
976
977	DPRINTF("Spawn tracee\n");
978	SYSCALL_REQUIRE(msg_open(&parent_tracee) == 0);
979	SYSCALL_REQUIRE(msg_open(&parent_tracer) == 0);
980	tracee = atf_utils_fork();
981	if (tracee == 0) {
982		parent = getppid();
983
984		// Wait for parent to let us exit
985		CHILD_TO_PARENT("tracee ready", parent_tracee, msg);
986		CHILD_FROM_PARENT("tracee exit", parent_tracee, msg);
987
988		FORKEE_ASSERT((fp = fopen(fname, "r")) != NULL);
989		fscanf(fp, "%s %d %d", s_executable, &s_pid, &s_ppid);
990		FORKEE_ASSERT(fclose(fp) == 0);
991		FORKEE_ASSERT_EQ(parent, s_ppid);
992
993		_exit(exitval_tracee);
994	}
995
996	DPRINTF("Wait for child to record its parent identifier (pid)\n");
997	PARENT_FROM_CHILD("tracee ready", parent_tracee, msg);
998
999	DPRINTF("Spawn debugger\n");
1000	tracer = atf_utils_fork();
1001	if (tracer == 0) {
1002		DPRINTF("Before calling PT_ATTACH from tracee %d\n", getpid());
1003		FORKEE_ASSERT(ptrace(PT_ATTACH, tracee, NULL, 0) != -1);
1004
1005		/* Wait for tracee and assert that it was stopped w/ SIGSTOP */
1006		FORKEE_REQUIRE_SUCCESS(
1007		    wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
1008
1009		forkee_status_stopped(status, SIGSTOP);
1010
1011		/* Resume tracee with PT_CONTINUE */
1012		FORKEE_ASSERT(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1);
1013
1014		/* Inform parent that tracer has attached to tracee */
1015		CHILD_TO_PARENT("tracer ready", parent_tracer, msg);
1016
1017		/* Wait for parent to tell use that tracee should have exited */
1018		CHILD_FROM_PARENT("wait for tracee exit", parent_tracer, msg);
1019
1020		/* Wait for tracee and assert that it exited */
1021		FORKEE_REQUIRE_SUCCESS(
1022		    wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
1023
1024		forkee_status_exited(status, exitval_tracee);
1025
1026		DPRINTF("Before exiting of the tracer process\n");
1027		_exit(exitval_tracer);
1028	}
1029	DPRINTF("Wait for the tracer to attach to the tracee\n");
1030	PARENT_FROM_CHILD("tracer ready", parent_tracer, msg);
1031	DPRINTF("Resume the tracee and let it exit\n");
1032	PARENT_TO_CHILD("tracee exit", parent_tracee, msg);
1033
1034	DPRINTF("Detect that tracee is zombie\n");
1035	await_zombie(tracee);
1036
1037	DPRINTF("Assert that there is no status about tracee - "
1038	    "Tracer must detect zombie first - calling %s()\n", TWAIT_FNAME);
1039	TWAIT_REQUIRE_SUCCESS(
1040	    wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 0);
1041
1042	DPRINTF("Resume the tracer and let it detect exited tracee\n");
1043	PARENT_TO_CHILD("Message 2", parent_tracer, msg);
1044
1045	DPRINTF("Wait for tracer to finish its job and exit - calling %s()\n",
1046	    TWAIT_FNAME);
1047	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracer, &status, 0),
1048	    tracer);
1049
1050	validate_status_exited(status, exitval_tracer);
1051
1052	DPRINTF("Wait for tracee to finish its job and exit - calling %s()\n",
1053	    TWAIT_FNAME);
1054	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracee, &status, WNOHANG),
1055	    tracee);
1056
1057	validate_status_exited(status, exitval_tracee);
1058
1059	msg_close(&parent_tracee);
1060	msg_close(&parent_tracer);
1061}
1062#endif
1063
1064ATF_TC(eventmask1);
1065ATF_TC_HEAD(eventmask1, tc)
1066{
1067	atf_tc_set_md_var(tc, "descr",
1068	    "Verify that empty EVENT_MASK is preserved");
1069}
1070
1071ATF_TC_BODY(eventmask1, tc)
1072{
1073	const int exitval = 5;
1074	const int sigval = SIGSTOP;
1075	pid_t child, wpid;
1076#if defined(TWAIT_HAVE_STATUS)
1077	int status;
1078#endif
1079	ptrace_event_t set_event, get_event;
1080	const int len = sizeof(ptrace_event_t);
1081
1082	DPRINTF("Before forking process PID=%d\n", getpid());
1083	SYSCALL_REQUIRE((child = fork()) != -1);
1084	if (child == 0) {
1085		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
1086		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
1087
1088		DPRINTF("Before raising %s from child\n", strsignal(sigval));
1089		FORKEE_ASSERT(raise(sigval) == 0);
1090
1091		DPRINTF("Before exiting of the child process\n");
1092		_exit(exitval);
1093	}
1094	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
1095
1096	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1097	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1098
1099	validate_status_stopped(status, sigval);
1100
1101	set_event.pe_set_event = 0;
1102	SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &set_event, len) != -1);
1103	SYSCALL_REQUIRE(ptrace(PT_GET_EVENT_MASK, child, &get_event, len) != -1);
1104	ATF_REQUIRE(memcmp(&set_event, &get_event, len) == 0);
1105
1106	DPRINTF("Before resuming the child process where it left off and "
1107	    "without signal to be sent\n");
1108	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1109
1110	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1111	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1112
1113	validate_status_exited(status, exitval);
1114
1115	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1116	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
1117}
1118
1119ATF_TC(eventmask2);
1120ATF_TC_HEAD(eventmask2, tc)
1121{
1122	atf_tc_set_md_var(tc, "descr",
1123	    "Verify that PTRACE_FORK in EVENT_MASK is preserved");
1124}
1125
1126ATF_TC_BODY(eventmask2, tc)
1127{
1128	const int exitval = 5;
1129	const int sigval = SIGSTOP;
1130	pid_t child, wpid;
1131#if defined(TWAIT_HAVE_STATUS)
1132	int status;
1133#endif
1134	ptrace_event_t set_event, get_event;
1135	const int len = sizeof(ptrace_event_t);
1136
1137	DPRINTF("Before forking process PID=%d\n", getpid());
1138	SYSCALL_REQUIRE((child = fork()) != -1);
1139	if (child == 0) {
1140		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
1141		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
1142
1143		DPRINTF("Before raising %s from child\n", strsignal(sigval));
1144		FORKEE_ASSERT(raise(sigval) == 0);
1145
1146		DPRINTF("Before exiting of the child process\n");
1147		_exit(exitval);
1148	}
1149	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
1150
1151	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1152	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1153
1154	validate_status_stopped(status, sigval);
1155
1156	set_event.pe_set_event = PTRACE_FORK;
1157	SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &set_event, len) != -1);
1158	SYSCALL_REQUIRE(ptrace(PT_GET_EVENT_MASK, child, &get_event, len) != -1);
1159	ATF_REQUIRE(memcmp(&set_event, &get_event, len) == 0);
1160
1161	DPRINTF("Before resuming the child process where it left off and "
1162	    "without signal to be sent\n");
1163	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1164
1165	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1166	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1167
1168	validate_status_exited(status, exitval);
1169
1170	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1171	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
1172}
1173
1174ATF_TC(eventmask3);
1175ATF_TC_HEAD(eventmask3, tc)
1176{
1177	atf_tc_set_md_var(tc, "descr",
1178	    "Verify that PTRACE_VFORK in EVENT_MASK is preserved");
1179}
1180
1181ATF_TC_BODY(eventmask3, tc)
1182{
1183	const int exitval = 5;
1184	const int sigval = SIGSTOP;
1185	pid_t child, wpid;
1186#if defined(TWAIT_HAVE_STATUS)
1187	int status;
1188#endif
1189	ptrace_event_t set_event, get_event;
1190	const int len = sizeof(ptrace_event_t);
1191
1192	atf_tc_expect_fail("PR kern/51630");
1193
1194	DPRINTF("Before forking process PID=%d\n", getpid());
1195	SYSCALL_REQUIRE((child = fork()) != -1);
1196	if (child == 0) {
1197		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
1198		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
1199
1200		DPRINTF("Before raising %s from child\n", strsignal(sigval));
1201		FORKEE_ASSERT(raise(sigval) == 0);
1202
1203		DPRINTF("Before exiting of the child process\n");
1204		_exit(exitval);
1205	}
1206	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
1207
1208	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1209	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1210
1211	validate_status_stopped(status, sigval);
1212
1213	set_event.pe_set_event = PTRACE_VFORK;
1214	SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &set_event, len) != -1 || errno == ENOTSUP);
1215	SYSCALL_REQUIRE(ptrace(PT_GET_EVENT_MASK, child, &get_event, len) != -1);
1216	ATF_REQUIRE(memcmp(&set_event, &get_event, len) == 0);
1217
1218	DPRINTF("Before resuming the child process where it left off and "
1219	    "without signal to be sent\n");
1220	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1221
1222	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1223	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1224
1225	validate_status_exited(status, exitval);
1226
1227	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1228	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
1229}
1230
1231ATF_TC(eventmask4);
1232ATF_TC_HEAD(eventmask4, tc)
1233{
1234	atf_tc_set_md_var(tc, "descr",
1235	    "Verify that PTRACE_VFORK_DONE in EVENT_MASK is preserved");
1236}
1237
1238ATF_TC_BODY(eventmask4, tc)
1239{
1240	const int exitval = 5;
1241	const int sigval = SIGSTOP;
1242	pid_t child, wpid;
1243#if defined(TWAIT_HAVE_STATUS)
1244	int status;
1245#endif
1246	ptrace_event_t set_event, get_event;
1247	const int len = sizeof(ptrace_event_t);
1248
1249	DPRINTF("Before forking process PID=%d\n", getpid());
1250	SYSCALL_REQUIRE((child = fork()) != -1);
1251	if (child == 0) {
1252		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
1253		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
1254
1255		DPRINTF("Before raising %s from child\n", strsignal(sigval));
1256		FORKEE_ASSERT(raise(sigval) == 0);
1257
1258		DPRINTF("Before exiting of the child process\n");
1259		_exit(exitval);
1260	}
1261	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
1262
1263	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1264	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1265
1266	validate_status_stopped(status, sigval);
1267
1268	set_event.pe_set_event = PTRACE_VFORK_DONE;
1269	SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &set_event, len) != -1);
1270	SYSCALL_REQUIRE(ptrace(PT_GET_EVENT_MASK, child, &get_event, len) != -1);
1271	ATF_REQUIRE(memcmp(&set_event, &get_event, len) == 0);
1272
1273	DPRINTF("Before resuming the child process where it left off and "
1274	    "without signal to be sent\n");
1275	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1276
1277	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1278	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1279
1280	validate_status_exited(status, exitval);
1281
1282	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1283	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
1284}
1285
1286ATF_TC(eventmask5);
1287ATF_TC_HEAD(eventmask5, tc)
1288{
1289	atf_tc_set_md_var(tc, "descr",
1290	    "Verify that PTRACE_LWP_CREATE in EVENT_MASK is preserved");
1291}
1292
1293ATF_TC_BODY(eventmask5, tc)
1294{
1295	const int exitval = 5;
1296	const int sigval = SIGSTOP;
1297	pid_t child, wpid;
1298#if defined(TWAIT_HAVE_STATUS)
1299	int status;
1300#endif
1301	ptrace_event_t set_event, get_event;
1302	const int len = sizeof(ptrace_event_t);
1303
1304	DPRINTF("Before forking process PID=%d\n", getpid());
1305	SYSCALL_REQUIRE((child = fork()) != -1);
1306	if (child == 0) {
1307		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
1308		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
1309
1310		DPRINTF("Before raising %s from child\n", strsignal(sigval));
1311		FORKEE_ASSERT(raise(sigval) == 0);
1312
1313		DPRINTF("Before exiting of the child process\n");
1314		_exit(exitval);
1315	}
1316	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
1317
1318	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1319	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1320
1321	validate_status_stopped(status, sigval);
1322
1323	set_event.pe_set_event = PTRACE_LWP_CREATE;
1324	SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &set_event, len) != -1);
1325	SYSCALL_REQUIRE(ptrace(PT_GET_EVENT_MASK, child, &get_event, len) != -1);
1326	ATF_REQUIRE(memcmp(&set_event, &get_event, len) == 0);
1327
1328	DPRINTF("Before resuming the child process where it left off and "
1329	    "without signal to be sent\n");
1330	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1331
1332	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1333	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1334
1335	validate_status_exited(status, exitval);
1336
1337	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1338	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
1339}
1340
1341ATF_TC(eventmask6);
1342ATF_TC_HEAD(eventmask6, tc)
1343{
1344	atf_tc_set_md_var(tc, "descr",
1345	    "Verify that PTRACE_LWP_EXIT in EVENT_MASK is preserved");
1346}
1347
1348ATF_TC_BODY(eventmask6, tc)
1349{
1350	const int exitval = 5;
1351	const int sigval = SIGSTOP;
1352	pid_t child, wpid;
1353#if defined(TWAIT_HAVE_STATUS)
1354	int status;
1355#endif
1356	ptrace_event_t set_event, get_event;
1357	const int len = sizeof(ptrace_event_t);
1358
1359	DPRINTF("Before forking process PID=%d\n", getpid());
1360	SYSCALL_REQUIRE((child = fork()) != -1);
1361	if (child == 0) {
1362		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
1363		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
1364
1365		DPRINTF("Before raising %s from child\n", strsignal(sigval));
1366		FORKEE_ASSERT(raise(sigval) == 0);
1367
1368		DPRINTF("Before exiting of the child process\n");
1369		_exit(exitval);
1370	}
1371	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
1372
1373	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1374	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1375
1376	validate_status_stopped(status, sigval);
1377
1378	set_event.pe_set_event = PTRACE_LWP_EXIT;
1379	SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &set_event, len) != -1);
1380	SYSCALL_REQUIRE(ptrace(PT_GET_EVENT_MASK, child, &get_event, len) != -1);
1381	ATF_REQUIRE(memcmp(&set_event, &get_event, len) == 0);
1382
1383	DPRINTF("Before resuming the child process where it left off and "
1384	    "without signal to be sent\n");
1385	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1386
1387	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1388	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1389
1390	validate_status_exited(status, exitval);
1391
1392	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1393	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
1394}
1395
1396static void
1397fork_body(pid_t (*fn)(void), bool trackfork, bool trackvfork,
1398          bool trackvforkdone, bool detachchild, bool detachparent)
1399{
1400	const int exitval = 5;
1401	const int exitval2 = 15;
1402	const int sigval = SIGSTOP;
1403	pid_t child, child2 = 0, wpid;
1404#if defined(TWAIT_HAVE_STATUS)
1405	int status;
1406#endif
1407	ptrace_state_t state;
1408	const int slen = sizeof(state);
1409	ptrace_event_t event;
1410	const int elen = sizeof(event);
1411
1412	if (trackvfork) {
1413		atf_tc_expect_fail("PR kern/51630");
1414	}
1415
1416	DPRINTF("Before forking process PID=%d\n", getpid());
1417	SYSCALL_REQUIRE((child = fork()) != -1);
1418	if (child == 0) {
1419		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
1420		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
1421
1422		DPRINTF("Before raising %s from child\n", strsignal(sigval));
1423		FORKEE_ASSERT(raise(sigval) == 0);
1424
1425		FORKEE_ASSERT((child2 = (fn)()) != -1);
1426
1427		if (child2 == 0)
1428			_exit(exitval2);
1429
1430		FORKEE_REQUIRE_SUCCESS
1431		    (wpid = TWAIT_GENERIC(child2, &status, 0), child2);
1432
1433		forkee_status_exited(status, exitval2);
1434
1435		DPRINTF("Before exiting of the child process\n");
1436		_exit(exitval);
1437	}
1438	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
1439
1440	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1441	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1442
1443	validate_status_stopped(status, sigval);
1444
1445	DPRINTF("Set 0%s%s%s in EVENT_MASK for the child %d\n",
1446	        trackfork ? "|PTRACE_FORK" : "",
1447	        trackvfork ? "|PTRACE_VFORK" : "",
1448	        trackvforkdone ? "|PTRACE_VFORK_DONE" : "", child);
1449	event.pe_set_event = 0;
1450	if (trackfork)
1451		event.pe_set_event |= PTRACE_FORK;
1452	if (trackvfork)
1453		event.pe_set_event |= PTRACE_VFORK;
1454	if (trackvforkdone)
1455		event.pe_set_event |= PTRACE_VFORK_DONE;
1456	SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1);
1457
1458	DPRINTF("Before resuming the child process where it left off and "
1459	    "without signal to be sent\n");
1460	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1461
1462#if defined(TWAIT_HAVE_PID)
1463	if ((trackfork && fn == fork) || (trackvfork && fn == vfork)) {
1464		DPRINTF("Before calling %s() for the child %d\n", TWAIT_FNAME,
1465		        child);
1466		TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0),
1467		                      child);
1468
1469		validate_status_stopped(status, SIGTRAP);
1470
1471		SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child, &state,
1472		                       slen) != -1);
1473		if (trackfork && fn == fork) {
1474			ATF_REQUIRE_EQ(state.pe_report_event & PTRACE_FORK,
1475			       PTRACE_FORK);
1476		}
1477		if (trackvfork && fn == vfork) {
1478			ATF_REQUIRE_EQ(state.pe_report_event & PTRACE_VFORK,
1479			       PTRACE_VFORK);
1480		}
1481
1482		child2 = state.pe_other_pid;
1483		DPRINTF("Reported ptrace event with forkee %d\n", child2);
1484
1485		DPRINTF("Before calling %s() for the forkee %d of the child "
1486		        "%d\n", TWAIT_FNAME, child2, child);
1487		TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child2, &status, 0),
1488		    child2);
1489
1490		validate_status_stopped(status, SIGTRAP);
1491
1492		SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child2, &state,
1493		                       slen) != -1);
1494		if (trackfork && fn == fork) {
1495			ATF_REQUIRE_EQ(state.pe_report_event & PTRACE_FORK,
1496			       PTRACE_FORK);
1497		}
1498		if (trackvfork && fn == vfork) {
1499			ATF_REQUIRE_EQ(state.pe_report_event & PTRACE_VFORK,
1500			       PTRACE_VFORK);
1501		}
1502
1503		ATF_REQUIRE_EQ(state.pe_other_pid, child);
1504
1505		DPRINTF("Before resuming the forkee process where it left off "
1506		    "and without signal to be sent\n");
1507		SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child2, (void *)1, 0)
1508		                != -1);
1509
1510		DPRINTF("Before resuming the child process where it left off "
1511		        "and without signal to be sent\n");
1512		SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1513	}
1514#endif
1515
1516	if (trackvforkdone && fn == vfork) {
1517		DPRINTF("Before calling %s() for the child %d\n", TWAIT_FNAME,
1518		        child);
1519		TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0),
1520		                      child);
1521
1522		validate_status_stopped(status, SIGTRAP);
1523
1524		SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child, &state,
1525		                       slen) != -1);
1526		ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_VFORK_DONE);
1527
1528		child2 = state.pe_other_pid;
1529		DPRINTF("Reported PTRACE_VFORK_DONE event with forkee %d\n",
1530		        child2);
1531
1532		DPRINTF("Before resuming the child process where it left off "
1533		        "and without signal to be sent\n");
1534		SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1535	}
1536
1537#if defined(TWAIT_HAVE_PID)
1538	if ((trackfork && fn == fork) || (trackvfork && fn == vfork)) {
1539		DPRINTF("Before calling %s() for the forkee - expected exited"
1540		        "\n", TWAIT_FNAME);
1541		TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child2, &status, 0),
1542		    child2);
1543
1544		validate_status_exited(status, exitval2);
1545
1546		DPRINTF("Before calling %s() for the forkee - expected no "
1547		        "process\n", TWAIT_FNAME);
1548		TWAIT_REQUIRE_FAILURE(ECHILD,
1549		    wpid = TWAIT_GENERIC(child2, &status, 0));
1550	}
1551#endif
1552
1553	DPRINTF("Before calling %s() for the child - expected stopped "
1554	    "SIGCHLD\n", TWAIT_FNAME);
1555	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1556
1557	validate_status_stopped(status, SIGCHLD);
1558
1559	DPRINTF("Before resuming the child process where it left off and "
1560	    "without signal to be sent\n");
1561	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1562
1563	DPRINTF("Before calling %s() for the child - expected exited\n",
1564	    TWAIT_FNAME);
1565	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1566
1567	validate_status_exited(status, exitval);
1568
1569	DPRINTF("Before calling %s() for the child - expected no process\n",
1570	    TWAIT_FNAME);
1571	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
1572}
1573
1574#define FORK_TEST(name,descr,fun,tfork,tvfork,tvforkdone,detchild,detparent)	\
1575ATF_TC(name);									\
1576ATF_TC_HEAD(name, tc)								\
1577{										\
1578	atf_tc_set_md_var(tc, "descr", descr);					\
1579}										\
1580										\
1581ATF_TC_BODY(name, tc)								\
1582{										\
1583										\
1584	fork_body(fun, tfork, tvfork, tvforkdone, detchild, detparent);		\
1585}
1586
1587#define F false
1588#define T true
1589
1590#define F_IF__0(x)
1591#define F_IF__1(x) x
1592#define F_IF__(x,y) F_IF__ ## x (y)
1593#define F_IF_(x,y) F_IF__(x,y)
1594#define F_IF(x,y) F_IF_(x,y)
1595
1596#define DSCR(function,forkbit,vforkbit,vforkdonebit,dchildbit,dparentbit)	\
1597        "Verify " #function "(2) called with 0"					\
1598        F_IF(forkbit,"|PTRACE_FORK")						\
1599        F_IF(vforkbit,"|PTRACE_VFORK")						\
1600        F_IF(vforkdonebit,"|PTRACE_VFORK_DONE")					\
1601        " in EVENT_MASK."							\
1602        F_IF(dchildbit," Detach child in this test.")				\
1603        F_IF(dparentbit," Detach parent in this test.")
1604
1605FORK_TEST(fork1, DSCR(fork,0,0,0,0,0), fork, F, F, F, F, F)
1606#if defined(TWAIT_HAVE_PID)
1607FORK_TEST(fork2, DSCR(fork,1,0,0,0,0), fork, T, F, F, F, F)
1608FORK_TEST(fork3, DSCR(fork,0,1,0,0,0), fork, F, T, F, F, F)
1609FORK_TEST(fork4, DSCR(fork,1,1,0,0,0), fork, T, T, F, F, F)
1610#endif
1611FORK_TEST(fork5, DSCR(fork,0,0,1,0,0), fork, F, F, T, F, F)
1612#if defined(TWAIT_HAVE_PID)
1613FORK_TEST(fork6, DSCR(fork,1,0,1,0,0), fork, T, F, T, F, F)
1614FORK_TEST(fork7, DSCR(fork,0,1,1,0,0), fork, F, T, T, F, F)
1615FORK_TEST(fork8, DSCR(fork,1,1,1,0,0), fork, T, T, T, F, F)
1616#endif
1617
1618FORK_TEST(vfork1, DSCR(vfork,0,0,0,0,0), vfork, F, F, F, F, F)
1619#if defined(TWAIT_HAVE_PID)
1620FORK_TEST(vfork2, DSCR(vfork,1,0,0,0,0), vfork, T, F, F, F, F)
1621FORK_TEST(vfork3, DSCR(vfork,0,1,0,0,0), vfork, F, T, F, F, F)
1622FORK_TEST(vfork4, DSCR(vfork,1,1,0,0,0), vfork, T, T, F, F, F)
1623#endif
1624FORK_TEST(vfork5, DSCR(vfork,0,0,1,0,0), vfork, F, F, T, F, F)
1625#if defined(TWAIT_HAVE_PID)
1626FORK_TEST(vfork6, DSCR(vfork,1,0,1,0,0), vfork, T, F, T, F, F)
1627FORK_TEST(vfork7, DSCR(vfork,0,1,1,0,0), vfork, F, T, T, F, F)
1628FORK_TEST(vfork8, DSCR(vfork,1,1,1,0,0), vfork, T, T, T, F, F)
1629#endif
1630
1631
1632
1633
1634ATF_TC(io_read_d1);
1635ATF_TC_HEAD(io_read_d1, tc)
1636{
1637	atf_tc_set_md_var(tc, "descr",
1638	    "Verify PT_IO with PIOD_READ_D and len = sizeof(uint8_t)");
1639}
1640
1641ATF_TC_BODY(io_read_d1, tc)
1642{
1643	const int exitval = 5;
1644	const int sigval = SIGSTOP;
1645	pid_t child, wpid;
1646	uint8_t lookup_me = 0;
1647	const uint8_t magic = 0xab;
1648	struct ptrace_io_desc io = {
1649		.piod_op = PIOD_READ_D,
1650		.piod_offs = &lookup_me,
1651		.piod_addr = &lookup_me,
1652		.piod_len = sizeof(lookup_me)
1653	};
1654#if defined(TWAIT_HAVE_STATUS)
1655	int status;
1656#endif
1657
1658	DPRINTF("Before forking process PID=%d\n", getpid());
1659	SYSCALL_REQUIRE((child = fork()) != -1);
1660	if (child == 0) {
1661		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
1662		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
1663
1664		lookup_me = magic;
1665
1666		DPRINTF("Before raising %s from child\n", strsignal(sigval));
1667		FORKEE_ASSERT(raise(sigval) == 0);
1668
1669		DPRINTF("Before exiting of the child process\n");
1670		_exit(exitval);
1671	}
1672	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
1673
1674	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1675	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1676
1677	validate_status_stopped(status, sigval);
1678
1679	DPRINTF("Read lookup_me from tracee (PID=%d) by tracer (PID=%d)\n",
1680	    child, getpid());
1681	SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1);
1682
1683	ATF_REQUIRE_EQ_MSG(lookup_me, magic,
1684	    "got value %" PRIx8 " != expected %" PRIx8, lookup_me, magic);
1685
1686	DPRINTF("Before resuming the child process where it left off and "
1687	    "without signal to be sent\n");
1688	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1689
1690	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1691	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1692
1693	validate_status_exited(status, exitval);
1694
1695	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1696	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
1697}
1698
1699ATF_TC(io_read_d2);
1700ATF_TC_HEAD(io_read_d2, tc)
1701{
1702	atf_tc_set_md_var(tc, "descr",
1703	    "Verify PT_IO with PIOD_READ_D and len = sizeof(uint16_t)");
1704}
1705
1706ATF_TC_BODY(io_read_d2, tc)
1707{
1708	const int exitval = 5;
1709	const int sigval = SIGSTOP;
1710	pid_t child, wpid;
1711	uint16_t lookup_me = 0;
1712	const uint16_t magic = 0x1234;
1713	struct ptrace_io_desc io = {
1714		.piod_op = PIOD_READ_D,
1715		.piod_offs = &lookup_me,
1716		.piod_addr = &lookup_me,
1717		.piod_len = sizeof(lookup_me)
1718	};
1719#if defined(TWAIT_HAVE_STATUS)
1720	int status;
1721#endif
1722
1723	DPRINTF("Before forking process PID=%d\n", getpid());
1724	SYSCALL_REQUIRE((child = fork()) != -1);
1725	if (child == 0) {
1726		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
1727		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
1728
1729		lookup_me = magic;
1730
1731		DPRINTF("Before raising %s from child\n", strsignal(sigval));
1732		FORKEE_ASSERT(raise(sigval) == 0);
1733
1734		DPRINTF("Before exiting of the child process\n");
1735		_exit(exitval);
1736	}
1737	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
1738
1739	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1740	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1741
1742	validate_status_stopped(status, sigval);
1743
1744	DPRINTF("Read lookup_me from tracee (PID=%d) by tracer (PID=%d)\n",
1745	    child, getpid());
1746	SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1);
1747
1748	ATF_REQUIRE_EQ_MSG(lookup_me, magic,
1749	    "got value %" PRIx16 " != expected %" PRIx16, lookup_me, magic);
1750
1751	DPRINTF("Before resuming the child process where it left off and "
1752	    "without signal to be sent\n");
1753	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1754
1755	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1756	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1757
1758	validate_status_exited(status, exitval);
1759
1760	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1761	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
1762}
1763
1764ATF_TC(io_read_d3);
1765ATF_TC_HEAD(io_read_d3, tc)
1766{
1767	atf_tc_set_md_var(tc, "descr",
1768	    "Verify PT_IO with PIOD_READ_D and len = sizeof(uint32_t)");
1769}
1770
1771ATF_TC_BODY(io_read_d3, tc)
1772{
1773	const int exitval = 5;
1774	const int sigval = SIGSTOP;
1775	pid_t child, wpid;
1776	uint32_t lookup_me = 0;
1777	const uint32_t magic = 0x1234abcd;
1778	struct ptrace_io_desc io = {
1779		.piod_op = PIOD_READ_D,
1780		.piod_offs = &lookup_me,
1781		.piod_addr = &lookup_me,
1782		.piod_len = sizeof(lookup_me)
1783	};
1784#if defined(TWAIT_HAVE_STATUS)
1785	int status;
1786#endif
1787
1788	DPRINTF("Before forking process PID=%d\n", getpid());
1789	SYSCALL_REQUIRE((child = fork()) != -1);
1790	if (child == 0) {
1791		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
1792		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
1793
1794		lookup_me = magic;
1795
1796		DPRINTF("Before raising %s from child\n", strsignal(sigval));
1797		FORKEE_ASSERT(raise(sigval) == 0);
1798
1799		DPRINTF("Before exiting of the child process\n");
1800		_exit(exitval);
1801	}
1802	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
1803
1804	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1805	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1806
1807	validate_status_stopped(status, sigval);
1808
1809	DPRINTF("Read lookup_me from tracee (PID=%d) by tracer (PID=%d)\n",
1810	    child, getpid());
1811	SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1);
1812
1813	ATF_REQUIRE_EQ_MSG(lookup_me, magic,
1814	    "got value %" PRIx32 " != expected %" PRIx32, lookup_me, magic);
1815
1816	DPRINTF("Before resuming the child process where it left off and "
1817	    "without signal to be sent\n");
1818	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1819
1820	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1821	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1822
1823	validate_status_exited(status, exitval);
1824
1825	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1826	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
1827}
1828
1829ATF_TC(io_read_d4);
1830ATF_TC_HEAD(io_read_d4, tc)
1831{
1832	atf_tc_set_md_var(tc, "descr",
1833	    "Verify PT_IO with PIOD_READ_D and len = sizeof(uint64_t)");
1834}
1835
1836ATF_TC_BODY(io_read_d4, tc)
1837{
1838	const int exitval = 5;
1839	const int sigval = SIGSTOP;
1840	pid_t child, wpid;
1841	uint64_t lookup_me = 0;
1842	const uint64_t magic = 0x1234abcd9876dcfa;
1843	struct ptrace_io_desc io = {
1844		.piod_op = PIOD_READ_D,
1845		.piod_offs = &lookup_me,
1846		.piod_addr = &lookup_me,
1847		.piod_len = sizeof(lookup_me)
1848	};
1849#if defined(TWAIT_HAVE_STATUS)
1850	int status;
1851#endif
1852
1853	DPRINTF("Before forking process PID=%d\n", getpid());
1854	SYSCALL_REQUIRE((child = fork()) != -1);
1855	if (child == 0) {
1856		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
1857		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
1858
1859		lookup_me = magic;
1860
1861		DPRINTF("Before raising %s from child\n", strsignal(sigval));
1862		FORKEE_ASSERT(raise(sigval) == 0);
1863
1864		DPRINTF("Before exiting of the child process\n");
1865		_exit(exitval);
1866	}
1867	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
1868
1869	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1870	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1871
1872	validate_status_stopped(status, sigval);
1873
1874	DPRINTF("Read lookup_me from tracee (PID=%d) by tracer (PID=%d)\n",
1875	    child, getpid());
1876	SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1);
1877
1878	ATF_REQUIRE_EQ_MSG(lookup_me, magic,
1879	    "got value %" PRIx64 " != expected %" PRIx64, lookup_me, magic);
1880
1881	DPRINTF("Before resuming the child process where it left off and "
1882	    "without signal to be sent\n");
1883	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1884
1885	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1886	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1887
1888	validate_status_exited(status, exitval);
1889
1890	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1891	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
1892}
1893
1894ATF_TC(io_write_d1);
1895ATF_TC_HEAD(io_write_d1, tc)
1896{
1897	atf_tc_set_md_var(tc, "descr",
1898	    "Verify PT_IO with PIOD_WRITE_D and len = sizeof(uint8_t)");
1899}
1900
1901ATF_TC_BODY(io_write_d1, tc)
1902{
1903	const int exitval = 5;
1904	const int sigval = SIGSTOP;
1905	pid_t child, wpid;
1906	uint8_t lookup_me = 0;
1907	const uint8_t magic = 0xab;
1908	struct ptrace_io_desc io = {
1909		.piod_op = PIOD_WRITE_D,
1910		.piod_offs = &lookup_me,
1911		.piod_addr = &lookup_me,
1912		.piod_len = sizeof(lookup_me)
1913	};
1914#if defined(TWAIT_HAVE_STATUS)
1915	int status;
1916#endif
1917
1918	DPRINTF("Before forking process PID=%d\n", getpid());
1919	SYSCALL_REQUIRE((child = fork()) != -1);
1920	if (child == 0) {
1921		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
1922		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
1923
1924		DPRINTF("Before raising %s from child\n", strsignal(sigval));
1925		FORKEE_ASSERT(raise(sigval) == 0);
1926
1927		FORKEE_ASSERT_EQ(lookup_me, magic);
1928
1929		DPRINTF("Before exiting of the child process\n");
1930		_exit(exitval);
1931	}
1932	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
1933
1934	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1935	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1936
1937	validate_status_stopped(status, sigval);
1938
1939	lookup_me = magic;
1940
1941	DPRINTF("Write new lookup_me to tracee (PID=%d) from tracer (PID=%d)\n",
1942	    child, getpid());
1943	SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1);
1944
1945	DPRINTF("Before resuming the child process where it left off and "
1946	    "without signal to be sent\n");
1947	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1948
1949	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1950	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1951
1952	validate_status_exited(status, exitval);
1953
1954	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1955	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
1956}
1957
1958ATF_TC(io_write_d2);
1959ATF_TC_HEAD(io_write_d2, tc)
1960{
1961	atf_tc_set_md_var(tc, "descr",
1962	    "Verify PT_IO with PIOD_WRITE_D and len = sizeof(uint16_t)");
1963}
1964
1965ATF_TC_BODY(io_write_d2, tc)
1966{
1967	const int exitval = 5;
1968	const int sigval = SIGSTOP;
1969	pid_t child, wpid;
1970	uint16_t lookup_me = 0;
1971	const uint16_t magic = 0xab12;
1972	struct ptrace_io_desc io = {
1973		.piod_op = PIOD_WRITE_D,
1974		.piod_offs = &lookup_me,
1975		.piod_addr = &lookup_me,
1976		.piod_len = sizeof(lookup_me)
1977	};
1978#if defined(TWAIT_HAVE_STATUS)
1979	int status;
1980#endif
1981
1982	DPRINTF("Before forking process PID=%d\n", getpid());
1983	SYSCALL_REQUIRE((child = fork()) != -1);
1984	if (child == 0) {
1985		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
1986		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
1987
1988		DPRINTF("Before raising %s from child\n", strsignal(sigval));
1989		FORKEE_ASSERT(raise(sigval) == 0);
1990
1991		FORKEE_ASSERT_EQ(lookup_me, magic);
1992
1993		DPRINTF("Before exiting of the child process\n");
1994		_exit(exitval);
1995	}
1996	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
1997
1998	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
1999	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
2000
2001	validate_status_stopped(status, sigval);
2002
2003	lookup_me = magic;
2004
2005	DPRINTF("Write new lookup_me to tracee (PID=%d) from tracer (PID=%d)\n",
2006	    child, getpid());
2007	SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1);
2008
2009	DPRINTF("Before resuming the child process where it left off and "
2010	    "without signal to be sent\n");
2011	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
2012
2013	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2014	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
2015
2016	validate_status_exited(status, exitval);
2017
2018	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2019	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
2020}
2021
2022ATF_TC(io_write_d3);
2023ATF_TC_HEAD(io_write_d3, tc)
2024{
2025	atf_tc_set_md_var(tc, "descr",
2026	    "Verify PT_IO with PIOD_WRITE_D and len = sizeof(uint32_t)");
2027}
2028
2029ATF_TC_BODY(io_write_d3, tc)
2030{
2031	const int exitval = 5;
2032	const int sigval = SIGSTOP;
2033	pid_t child, wpid;
2034	uint32_t lookup_me = 0;
2035	const uint32_t magic = 0xab127643;
2036	struct ptrace_io_desc io = {
2037		.piod_op = PIOD_WRITE_D,
2038		.piod_offs = &lookup_me,
2039		.piod_addr = &lookup_me,
2040		.piod_len = sizeof(lookup_me)
2041	};
2042#if defined(TWAIT_HAVE_STATUS)
2043	int status;
2044#endif
2045
2046	DPRINTF("Before forking process PID=%d\n", getpid());
2047	SYSCALL_REQUIRE((child = fork()) != -1);
2048	if (child == 0) {
2049		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
2050		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
2051
2052		DPRINTF("Before raising %s from child\n", strsignal(sigval));
2053		FORKEE_ASSERT(raise(sigval) == 0);
2054
2055		FORKEE_ASSERT_EQ(lookup_me, magic);
2056
2057		DPRINTF("Before exiting of the child process\n");
2058		_exit(exitval);
2059	}
2060	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
2061
2062	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2063	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
2064
2065	validate_status_stopped(status, sigval);
2066
2067	lookup_me = magic;
2068
2069	DPRINTF("Write new lookup_me to tracee (PID=%d) from tracer (PID=%d)\n",
2070	    child, getpid());
2071	SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1);
2072
2073	DPRINTF("Before resuming the child process where it left off and "
2074	    "without signal to be sent\n");
2075	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
2076
2077	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2078	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
2079
2080	validate_status_exited(status, exitval);
2081
2082	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2083	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
2084}
2085
2086ATF_TC(io_write_d4);
2087ATF_TC_HEAD(io_write_d4, tc)
2088{
2089	atf_tc_set_md_var(tc, "descr",
2090	    "Verify PT_IO with PIOD_WRITE_D and len = sizeof(uint64_t)");
2091}
2092
2093ATF_TC_BODY(io_write_d4, tc)
2094{
2095	const int exitval = 5;
2096	const int sigval = SIGSTOP;
2097	pid_t child, wpid;
2098	uint64_t lookup_me = 0;
2099	const uint64_t magic = 0xab12764376490123;
2100	struct ptrace_io_desc io = {
2101		.piod_op = PIOD_WRITE_D,
2102		.piod_offs = &lookup_me,
2103		.piod_addr = &lookup_me,
2104		.piod_len = sizeof(lookup_me)
2105	};
2106#if defined(TWAIT_HAVE_STATUS)
2107	int status;
2108#endif
2109
2110	DPRINTF("Before forking process PID=%d\n", getpid());
2111	SYSCALL_REQUIRE((child = fork()) != -1);
2112	if (child == 0) {
2113		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
2114		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
2115
2116		DPRINTF("Before raising %s from child\n", strsignal(sigval));
2117		FORKEE_ASSERT(raise(sigval) == 0);
2118
2119		FORKEE_ASSERT_EQ(lookup_me, magic);
2120
2121		DPRINTF("Before exiting of the child process\n");
2122		_exit(exitval);
2123	}
2124	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
2125
2126	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2127	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
2128
2129	validate_status_stopped(status, sigval);
2130
2131	lookup_me = magic;
2132
2133	DPRINTF("Write new lookup_me to tracee (PID=%d) from tracer (PID=%d)\n",
2134	    child, getpid());
2135	SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1);
2136
2137	DPRINTF("Before resuming the child process where it left off and "
2138	    "without signal to be sent\n");
2139	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
2140
2141	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2142	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
2143
2144	validate_status_exited(status, exitval);
2145
2146	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2147	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
2148}
2149
2150ATF_TC(io_read_auxv1);
2151ATF_TC_HEAD(io_read_auxv1, tc)
2152{
2153	atf_tc_set_md_var(tc, "descr",
2154	    "Verify PT_READ_AUXV called for tracee");
2155}
2156
2157ATF_TC_BODY(io_read_auxv1, tc)
2158{
2159	const int exitval = 5;
2160	const int sigval = SIGSTOP;
2161	pid_t child, wpid;
2162#if defined(TWAIT_HAVE_STATUS)
2163	int status;
2164#endif
2165	AuxInfo ai[100], *aip;
2166	struct ptrace_io_desc io = {
2167		.piod_op = PIOD_READ_AUXV,
2168		.piod_offs = 0,
2169		.piod_addr = ai,
2170		.piod_len = sizeof(ai)
2171	};
2172
2173	DPRINTF("Before forking process PID=%d\n", getpid());
2174	SYSCALL_REQUIRE((child = fork()) != -1);
2175	if (child == 0) {
2176		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
2177		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
2178
2179		DPRINTF("Before raising %s from child\n", strsignal(sigval));
2180		FORKEE_ASSERT(raise(sigval) == 0);
2181
2182		DPRINTF("Before exiting of the child process\n");
2183		_exit(exitval);
2184	}
2185	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
2186
2187	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2188	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
2189
2190	validate_status_stopped(status, sigval);
2191
2192	DPRINTF("Read new AUXV from tracee (PID=%d) by tracer (PID=%d)\n",
2193	    child, getpid());
2194	SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1);
2195
2196	DPRINTF("Asserting that AUXV length (%zu) is > 0\n", io.piod_len);
2197	ATF_REQUIRE(io.piod_len > 0);
2198
2199	for (aip = ai; aip->a_type != AT_NULL; aip++)
2200		DPRINTF("a_type=%#llx a_v=%#llx\n",
2201		    (long long int)aip->a_type, (long long int)aip->a_v);
2202
2203	DPRINTF("Before resuming the child process where it left off and "
2204	    "without signal to be sent\n");
2205	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
2206
2207	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2208	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
2209
2210	validate_status_exited(status, exitval);
2211
2212	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2213	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
2214}
2215
2216ATF_TC(read_d1);
2217ATF_TC_HEAD(read_d1, tc)
2218{
2219	atf_tc_set_md_var(tc, "descr",
2220	    "Verify PT_READ_D called once");
2221}
2222
2223ATF_TC_BODY(read_d1, tc)
2224{
2225	const int exitval = 5;
2226	const int sigval = SIGSTOP;
2227	pid_t child, wpid;
2228	int lookup_me = 0;
2229	const int magic = (int)random();
2230#if defined(TWAIT_HAVE_STATUS)
2231	int status;
2232#endif
2233
2234	DPRINTF("Before forking process PID=%d\n", getpid());
2235	SYSCALL_REQUIRE((child = fork()) != -1);
2236	if (child == 0) {
2237		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
2238		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
2239
2240		lookup_me = magic;
2241
2242		DPRINTF("Before raising %s from child\n", strsignal(sigval));
2243		FORKEE_ASSERT(raise(sigval) == 0);
2244
2245		DPRINTF("Before exiting of the child process\n");
2246		_exit(exitval);
2247	}
2248	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
2249
2250	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2251	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
2252
2253	validate_status_stopped(status, sigval);
2254
2255	DPRINTF("Read new lookup_me from tracee (PID=%d) by tracer (PID=%d)\n",
2256	    child, getpid());
2257	errno = 0;
2258	lookup_me = ptrace(PT_READ_D, child, &lookup_me, 0);
2259	SYSCALL_REQUIRE_ERRNO(errno, 0);
2260
2261	ATF_REQUIRE_EQ_MSG(lookup_me, magic,
2262	    "got value %#x != expected %#x", lookup_me, magic);
2263
2264	DPRINTF("Before resuming the child process where it left off and "
2265	    "without signal to be sent\n");
2266	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
2267
2268	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2269	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
2270
2271	validate_status_exited(status, exitval);
2272
2273	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2274	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
2275}
2276
2277ATF_TC(read_d2);
2278ATF_TC_HEAD(read_d2, tc)
2279{
2280	atf_tc_set_md_var(tc, "descr",
2281	    "Verify PT_READ_D called twice");
2282}
2283
2284ATF_TC_BODY(read_d2, tc)
2285{
2286	const int exitval = 5;
2287	const int sigval = SIGSTOP;
2288	pid_t child, wpid;
2289	int lookup_me1 = 0;
2290	int lookup_me2 = 0;
2291	const int magic1 = (int)random();
2292	const int magic2 = (int)random();
2293#if defined(TWAIT_HAVE_STATUS)
2294	int status;
2295#endif
2296
2297	DPRINTF("Before forking process PID=%d\n", getpid());
2298	SYSCALL_REQUIRE((child = fork()) != -1);
2299	if (child == 0) {
2300		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
2301		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
2302
2303		lookup_me1 = magic1;
2304		lookup_me2 = magic2;
2305
2306		DPRINTF("Before raising %s from child\n", strsignal(sigval));
2307		FORKEE_ASSERT(raise(sigval) == 0);
2308
2309		DPRINTF("Before exiting of the child process\n");
2310		_exit(exitval);
2311	}
2312	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
2313
2314	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2315	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
2316
2317	validate_status_stopped(status, sigval);
2318
2319	DPRINTF("Read new lookup_me1 from tracee (PID=%d) by tracer (PID=%d)\n",
2320	    child, getpid());
2321	errno = 0;
2322	lookup_me1 = ptrace(PT_READ_D, child, &lookup_me1, 0);
2323	SYSCALL_REQUIRE_ERRNO(errno, 0);
2324
2325	ATF_REQUIRE_EQ_MSG(lookup_me1, magic1,
2326	    "got value %#x != expected %#x", lookup_me1, magic1);
2327
2328	DPRINTF("Read new lookup_me2 from tracee (PID=%d) by tracer (PID=%d)\n",
2329	    child, getpid());
2330	errno = 0;
2331	lookup_me2 = ptrace(PT_READ_D, child, &lookup_me2, 0);
2332	SYSCALL_REQUIRE_ERRNO(errno, 0);
2333
2334	ATF_REQUIRE_EQ_MSG(lookup_me2, magic2,
2335	    "got value %#x != expected %#x", lookup_me2, magic2);
2336
2337	DPRINTF("Before resuming the child process where it left off and "
2338	    "without signal to be sent\n");
2339	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
2340
2341	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2342	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
2343
2344	validate_status_exited(status, exitval);
2345
2346	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2347	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
2348}
2349
2350ATF_TC(read_d3);
2351ATF_TC_HEAD(read_d3, tc)
2352{
2353	atf_tc_set_md_var(tc, "descr",
2354	    "Verify PT_READ_D called three times");
2355}
2356
2357ATF_TC_BODY(read_d3, tc)
2358{
2359	const int exitval = 5;
2360	const int sigval = SIGSTOP;
2361	pid_t child, wpid;
2362	int lookup_me1 = 0;
2363	int lookup_me2 = 0;
2364	int lookup_me3 = 0;
2365	const int magic1 = (int)random();
2366	const int magic2 = (int)random();
2367	const int magic3 = (int)random();
2368#if defined(TWAIT_HAVE_STATUS)
2369	int status;
2370#endif
2371
2372	DPRINTF("Before forking process PID=%d\n", getpid());
2373	SYSCALL_REQUIRE((child = fork()) != -1);
2374	if (child == 0) {
2375		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
2376		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
2377
2378		lookup_me1 = magic1;
2379		lookup_me2 = magic2;
2380		lookup_me3 = magic3;
2381
2382		DPRINTF("Before raising %s from child\n", strsignal(sigval));
2383		FORKEE_ASSERT(raise(sigval) == 0);
2384
2385		DPRINTF("Before exiting of the child process\n");
2386		_exit(exitval);
2387	}
2388	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
2389
2390	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2391	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
2392
2393	validate_status_stopped(status, sigval);
2394
2395	DPRINTF("Read new lookup_me1 from tracee (PID=%d) by tracer (PID=%d)\n",
2396	    child, getpid());
2397	errno = 0;
2398	lookup_me1 = ptrace(PT_READ_D, child, &lookup_me1, 0);
2399	SYSCALL_REQUIRE_ERRNO(errno, 0);
2400
2401	ATF_REQUIRE_EQ_MSG(lookup_me1, magic1,
2402	    "got value %#x != expected %#x", lookup_me1, magic1);
2403
2404	DPRINTF("Read new lookup_me2 from tracee (PID=%d) by tracer (PID=%d)\n",
2405	    child, getpid());
2406	errno = 0;
2407	lookup_me2 = ptrace(PT_READ_D, child, &lookup_me2, 0);
2408	SYSCALL_REQUIRE_ERRNO(errno, 0);
2409
2410	ATF_REQUIRE_EQ_MSG(lookup_me2, magic2,
2411	    "got value %#x != expected %#x", lookup_me2, magic2);
2412
2413	DPRINTF("Read new lookup_me3 from tracee (PID=%d) by tracer (PID=%d)\n",
2414	    child, getpid());
2415	errno = 0;
2416	lookup_me3 = ptrace(PT_READ_D, child, &lookup_me3, 0);
2417	SYSCALL_REQUIRE_ERRNO(errno, 0);
2418
2419	ATF_REQUIRE_EQ_MSG(lookup_me3, magic3,
2420	    "got value %#x != expected %#x", lookup_me3, magic3);
2421
2422	DPRINTF("Before resuming the child process where it left off and "
2423	    "without signal to be sent\n");
2424	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
2425
2426	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2427	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
2428
2429	validate_status_exited(status, exitval);
2430
2431	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2432	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
2433}
2434
2435ATF_TC(read_d4);
2436ATF_TC_HEAD(read_d4, tc)
2437{
2438	atf_tc_set_md_var(tc, "descr",
2439	    "Verify PT_READ_D called four times");
2440}
2441
2442ATF_TC_BODY(read_d4, tc)
2443{
2444	const int exitval = 5;
2445	const int sigval = SIGSTOP;
2446	pid_t child, wpid;
2447	int lookup_me1 = 0;
2448	int lookup_me2 = 0;
2449	int lookup_me3 = 0;
2450	int lookup_me4 = 0;
2451	const int magic1 = (int)random();
2452	const int magic2 = (int)random();
2453	const int magic3 = (int)random();
2454	const int magic4 = (int)random();
2455#if defined(TWAIT_HAVE_STATUS)
2456	int status;
2457#endif
2458
2459	DPRINTF("Before forking process PID=%d\n", getpid());
2460	SYSCALL_REQUIRE((child = fork()) != -1);
2461	if (child == 0) {
2462		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
2463		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
2464
2465		lookup_me1 = magic1;
2466		lookup_me2 = magic2;
2467		lookup_me3 = magic3;
2468		lookup_me4 = magic4;
2469
2470		DPRINTF("Before raising %s from child\n", strsignal(sigval));
2471		FORKEE_ASSERT(raise(sigval) == 0);
2472
2473		DPRINTF("Before exiting of the child process\n");
2474		_exit(exitval);
2475	}
2476	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
2477
2478	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2479	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
2480
2481	validate_status_stopped(status, sigval);
2482
2483	DPRINTF("Read new lookup_me1 from tracee (PID=%d) by tracer (PID=%d)\n",
2484	    child, getpid());
2485	errno = 0;
2486	lookup_me1 = ptrace(PT_READ_D, child, &lookup_me1, 0);
2487	SYSCALL_REQUIRE_ERRNO(errno, 0);
2488
2489	ATF_REQUIRE_EQ_MSG(lookup_me1, magic1,
2490	    "got value %#x != expected %#x", lookup_me1, magic1);
2491
2492	DPRINTF("Read new lookup_me2 from tracee (PID=%d) by tracer (PID=%d)\n",
2493	    child, getpid());
2494	errno = 0;
2495	lookup_me2 = ptrace(PT_READ_D, child, &lookup_me2, 0);
2496	SYSCALL_REQUIRE_ERRNO(errno, 0);
2497
2498	ATF_REQUIRE_EQ_MSG(lookup_me2, magic2,
2499	    "got value %#x != expected %#x", lookup_me2, magic2);
2500
2501	DPRINTF("Read new lookup_me3 from tracee (PID=%d) by tracer (PID=%d)\n",
2502	    child, getpid());
2503	errno = 0;
2504	lookup_me3 = ptrace(PT_READ_D, child, &lookup_me3, 0);
2505	SYSCALL_REQUIRE_ERRNO(errno, 0);
2506
2507	ATF_REQUIRE_EQ_MSG(lookup_me3, magic3,
2508	    "got value %#x != expected %#x", lookup_me3, magic3);
2509
2510	DPRINTF("Read new lookup_me4 from tracee (PID=%d) by tracer (PID=%d)\n",
2511	    child, getpid());
2512	errno = 0;
2513	lookup_me4 = ptrace(PT_READ_D, child, &lookup_me4, 0);
2514	SYSCALL_REQUIRE_ERRNO(errno, 0);
2515
2516	ATF_REQUIRE_EQ_MSG(lookup_me4, magic4,
2517	    "got value %#x != expected %#x", lookup_me4, magic4);
2518
2519	DPRINTF("Before resuming the child process where it left off and "
2520	    "without signal to be sent\n");
2521	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
2522
2523	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2524	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
2525
2526	validate_status_exited(status, exitval);
2527
2528	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2529	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
2530}
2531
2532ATF_TC(write_d1);
2533ATF_TC_HEAD(write_d1, tc)
2534{
2535	atf_tc_set_md_var(tc, "descr",
2536	    "Verify PT_WRITE_D called once");
2537}
2538
2539ATF_TC_BODY(write_d1, tc)
2540{
2541	const int exitval = 5;
2542	const int sigval = SIGSTOP;
2543	pid_t child, wpid;
2544	int lookup_me = 0;
2545	const int magic = (int)random();
2546#if defined(TWAIT_HAVE_STATUS)
2547	int status;
2548#endif
2549
2550	DPRINTF("Before forking process PID=%d\n", getpid());
2551	SYSCALL_REQUIRE((child = fork()) != -1);
2552	if (child == 0) {
2553		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
2554		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
2555
2556		DPRINTF("Before raising %s from child\n", strsignal(sigval));
2557		FORKEE_ASSERT(raise(sigval) == 0);
2558
2559		FORKEE_ASSERT_EQ(lookup_me, magic);
2560
2561		DPRINTF("Before exiting of the child process\n");
2562		_exit(exitval);
2563	}
2564	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
2565
2566	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2567	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
2568
2569	validate_status_stopped(status, sigval);
2570
2571	DPRINTF("Write new lookup_me to tracee (PID=%d) from tracer (PID=%d)\n",
2572	    child, getpid());
2573	SYSCALL_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me, magic) != -1);
2574
2575	DPRINTF("Before resuming the child process where it left off and "
2576	    "without signal to be sent\n");
2577	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
2578
2579	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2580	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
2581
2582	validate_status_exited(status, exitval);
2583
2584	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2585	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
2586}
2587
2588ATF_TC(write_d2);
2589ATF_TC_HEAD(write_d2, tc)
2590{
2591	atf_tc_set_md_var(tc, "descr",
2592	    "Verify PT_WRITE_D called twice");
2593}
2594
2595ATF_TC_BODY(write_d2, tc)
2596{
2597	const int exitval = 5;
2598	const int sigval = SIGSTOP;
2599	pid_t child, wpid;
2600	int lookup_me1 = 0;
2601	int lookup_me2 = 0;
2602	const int magic1 = (int)random();
2603	const int magic2 = (int)random();
2604#if defined(TWAIT_HAVE_STATUS)
2605	int status;
2606#endif
2607
2608	DPRINTF("Before forking process PID=%d\n", getpid());
2609	SYSCALL_REQUIRE((child = fork()) != -1);
2610	if (child == 0) {
2611		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
2612		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
2613
2614		DPRINTF("Before raising %s from child\n", strsignal(sigval));
2615		FORKEE_ASSERT(raise(sigval) == 0);
2616
2617		FORKEE_ASSERT_EQ(lookup_me1, magic1);
2618		FORKEE_ASSERT_EQ(lookup_me2, magic2);
2619
2620		DPRINTF("Before exiting of the child process\n");
2621		_exit(exitval);
2622	}
2623	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
2624
2625	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2626	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
2627
2628	validate_status_stopped(status, sigval);
2629
2630	DPRINTF("Write new lookup_me1 to tracee (PID=%d) from tracer (PID=%d)\n",
2631	    child, getpid());
2632	SYSCALL_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me1, magic1) != -1);
2633
2634	DPRINTF("Write new lookup_me2 to tracee (PID=%d) from tracer (PID=%d)\n",
2635	    child, getpid());
2636	SYSCALL_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me2, magic2) != -1);
2637
2638	DPRINTF("Before resuming the child process where it left off and "
2639	    "without signal to be sent\n");
2640	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
2641
2642	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2643	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
2644
2645	validate_status_exited(status, exitval);
2646
2647	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2648	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
2649}
2650
2651ATF_TC(write_d3);
2652ATF_TC_HEAD(write_d3, tc)
2653{
2654	atf_tc_set_md_var(tc, "descr",
2655	    "Verify PT_WRITE_D called three times");
2656}
2657
2658ATF_TC_BODY(write_d3, tc)
2659{
2660	const int exitval = 5;
2661	const int sigval = SIGSTOP;
2662	pid_t child, wpid;
2663	int lookup_me1 = 0;
2664	int lookup_me2 = 0;
2665	int lookup_me3 = 0;
2666	const int magic1 = (int)random();
2667	const int magic2 = (int)random();
2668	const int magic3 = (int)random();
2669#if defined(TWAIT_HAVE_STATUS)
2670	int status;
2671#endif
2672
2673	DPRINTF("Before forking process PID=%d\n", getpid());
2674	SYSCALL_REQUIRE((child = fork()) != -1);
2675	if (child == 0) {
2676		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
2677		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
2678
2679		DPRINTF("Before raising %s from child\n", strsignal(sigval));
2680		FORKEE_ASSERT(raise(sigval) == 0);
2681
2682		FORKEE_ASSERT_EQ(lookup_me1, magic1);
2683		FORKEE_ASSERT_EQ(lookup_me2, magic2);
2684		FORKEE_ASSERT_EQ(lookup_me3, magic3);
2685
2686		DPRINTF("Before exiting of the child process\n");
2687		_exit(exitval);
2688	}
2689	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
2690
2691	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2692	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
2693
2694	validate_status_stopped(status, sigval);
2695
2696	DPRINTF("Write new lookup_me1 to tracee (PID=%d) from tracer (PID=%d)\n",
2697	    child, getpid());
2698	SYSCALL_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me1, magic1) != -1);
2699
2700	DPRINTF("Write new lookup_me2 to tracee (PID=%d) from tracer (PID=%d)\n",
2701	    child, getpid());
2702	SYSCALL_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me2, magic2) != -1);
2703
2704	DPRINTF("Write new lookup_me3 to tracee (PID=%d) from tracer (PID=%d)\n",
2705	    child, getpid());
2706	SYSCALL_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me3, magic3) != -1);
2707
2708	DPRINTF("Before resuming the child process where it left off and "
2709	    "without signal to be sent\n");
2710	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
2711
2712	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2713	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
2714
2715	validate_status_exited(status, exitval);
2716
2717	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2718	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
2719}
2720
2721ATF_TC(write_d4);
2722ATF_TC_HEAD(write_d4, tc)
2723{
2724	atf_tc_set_md_var(tc, "descr",
2725	    "Verify PT_WRITE_D called four times");
2726}
2727
2728ATF_TC_BODY(write_d4, tc)
2729{
2730	const int exitval = 5;
2731	const int sigval = SIGSTOP;
2732	pid_t child, wpid;
2733	int lookup_me1 = 0;
2734	int lookup_me2 = 0;
2735	int lookup_me3 = 0;
2736	int lookup_me4 = 0;
2737	const int magic1 = (int)random();
2738	const int magic2 = (int)random();
2739	const int magic3 = (int)random();
2740	const int magic4 = (int)random();
2741#if defined(TWAIT_HAVE_STATUS)
2742	int status;
2743#endif
2744
2745	DPRINTF("Before forking process PID=%d\n", getpid());
2746	SYSCALL_REQUIRE((child = fork()) != -1);
2747	if (child == 0) {
2748		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
2749		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
2750
2751		DPRINTF("Before raising %s from child\n", strsignal(sigval));
2752		FORKEE_ASSERT(raise(sigval) == 0);
2753
2754		FORKEE_ASSERT_EQ(lookup_me1, magic1);
2755		FORKEE_ASSERT_EQ(lookup_me2, magic2);
2756		FORKEE_ASSERT_EQ(lookup_me3, magic3);
2757		FORKEE_ASSERT_EQ(lookup_me4, magic4);
2758
2759		DPRINTF("Before exiting of the child process\n");
2760		_exit(exitval);
2761	}
2762	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
2763
2764	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2765	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
2766
2767	validate_status_stopped(status, sigval);
2768
2769	DPRINTF("Write new lookup_me1 to tracee (PID=%d) from tracer (PID=%d)\n",
2770	    child, getpid());
2771	SYSCALL_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me1, magic1) != -1);
2772
2773	DPRINTF("Write new lookup_me2 to tracee (PID=%d) from tracer (PID=%d)\n",
2774	    child, getpid());
2775	SYSCALL_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me2, magic2) != -1);
2776
2777	DPRINTF("Write new lookup_me3 to tracee (PID=%d) from tracer (PID=%d)\n",
2778	    child, getpid());
2779	SYSCALL_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me3, magic3) != -1);
2780
2781	DPRINTF("Write new lookup_me4 to tracee (PID=%d) from tracer (PID=%d)\n",
2782	    child, getpid());
2783	SYSCALL_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me4, magic4) != -1);
2784
2785	DPRINTF("Before resuming the child process where it left off and "
2786	    "without signal to be sent\n");
2787	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
2788
2789	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2790	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
2791
2792	validate_status_exited(status, exitval);
2793
2794	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2795	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
2796}
2797
2798ATF_TC(io_read_d_write_d_handshake1);
2799ATF_TC_HEAD(io_read_d_write_d_handshake1, tc)
2800{
2801	atf_tc_set_md_var(tc, "descr",
2802	    "Verify PT_IO with PIOD_READ_D and PIOD_WRITE_D handshake");
2803}
2804
2805ATF_TC_BODY(io_read_d_write_d_handshake1, tc)
2806{
2807	const int exitval = 5;
2808	const int sigval = SIGSTOP;
2809	pid_t child, wpid;
2810	uint8_t lookup_me_fromtracee = 0;
2811	const uint8_t magic_fromtracee = (uint8_t)random();
2812	uint8_t lookup_me_totracee = 0;
2813	const uint8_t magic_totracee = (uint8_t)random();
2814	struct ptrace_io_desc io_fromtracee = {
2815		.piod_op = PIOD_READ_D,
2816		.piod_offs = &lookup_me_fromtracee,
2817		.piod_addr = &lookup_me_fromtracee,
2818		.piod_len = sizeof(lookup_me_fromtracee)
2819	};
2820	struct ptrace_io_desc io_totracee = {
2821		.piod_op = PIOD_WRITE_D,
2822		.piod_offs = &lookup_me_totracee,
2823		.piod_addr = &lookup_me_totracee,
2824		.piod_len = sizeof(lookup_me_totracee)
2825	};
2826#if defined(TWAIT_HAVE_STATUS)
2827	int status;
2828#endif
2829
2830	DPRINTF("Before forking process PID=%d\n", getpid());
2831	SYSCALL_REQUIRE((child = fork()) != -1);
2832	if (child == 0) {
2833		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
2834		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
2835
2836		lookup_me_fromtracee = magic_fromtracee;
2837
2838		DPRINTF("Before raising %s from child\n", strsignal(sigval));
2839		FORKEE_ASSERT(raise(sigval) == 0);
2840
2841		FORKEE_ASSERT_EQ(lookup_me_totracee, magic_totracee);
2842
2843		DPRINTF("Before exiting of the child process\n");
2844		_exit(exitval);
2845	}
2846	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
2847
2848	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2849	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
2850
2851	validate_status_stopped(status, sigval);
2852
2853	DPRINTF("Read lookup_me_fromtracee PID=%d by tracer (PID=%d)\n",
2854	    child, getpid());
2855	SYSCALL_REQUIRE(ptrace(PT_IO, child, &io_fromtracee, 0) != -1);
2856
2857	ATF_REQUIRE_EQ_MSG(lookup_me_fromtracee, magic_fromtracee,
2858	    "got value %" PRIx8 " != expected %" PRIx8, lookup_me_fromtracee,
2859	    magic_fromtracee);
2860
2861	lookup_me_totracee = magic_totracee;
2862
2863	DPRINTF("Write lookup_me_totracee to PID=%d by tracer (PID=%d)\n",
2864	    child, getpid());
2865	SYSCALL_REQUIRE(ptrace(PT_IO, child, &io_totracee, 0) != -1);
2866
2867	ATF_REQUIRE_EQ_MSG(lookup_me_totracee, magic_totracee,
2868	    "got value %" PRIx8 " != expected %" PRIx8, lookup_me_totracee,
2869	    magic_totracee);
2870
2871	DPRINTF("Before resuming the child process where it left off and "
2872	    "without signal to be sent\n");
2873	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
2874
2875	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2876	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
2877
2878	validate_status_exited(status, exitval);
2879
2880	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2881	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
2882}
2883
2884ATF_TC(io_read_d_write_d_handshake2);
2885ATF_TC_HEAD(io_read_d_write_d_handshake2, tc)
2886{
2887	atf_tc_set_md_var(tc, "descr",
2888	    "Verify PT_IO with PIOD_WRITE_D and PIOD_READ_D handshake");
2889}
2890
2891ATF_TC_BODY(io_read_d_write_d_handshake2, tc)
2892{
2893	const int exitval = 5;
2894	const int sigval = SIGSTOP;
2895	pid_t child, wpid;
2896	uint8_t lookup_me_fromtracee = 0;
2897	const uint8_t magic_fromtracee = (uint8_t)random();
2898	uint8_t lookup_me_totracee = 0;
2899	const uint8_t magic_totracee = (uint8_t)random();
2900	struct ptrace_io_desc io_fromtracee = {
2901		.piod_op = PIOD_READ_D,
2902		.piod_offs = &lookup_me_fromtracee,
2903		.piod_addr = &lookup_me_fromtracee,
2904		.piod_len = sizeof(lookup_me_fromtracee)
2905	};
2906	struct ptrace_io_desc io_totracee = {
2907		.piod_op = PIOD_WRITE_D,
2908		.piod_offs = &lookup_me_totracee,
2909		.piod_addr = &lookup_me_totracee,
2910		.piod_len = sizeof(lookup_me_totracee)
2911	};
2912#if defined(TWAIT_HAVE_STATUS)
2913	int status;
2914#endif
2915
2916	DPRINTF("Before forking process PID=%d\n", getpid());
2917	SYSCALL_REQUIRE((child = fork()) != -1);
2918	if (child == 0) {
2919		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
2920		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
2921
2922		lookup_me_fromtracee = magic_fromtracee;
2923
2924		DPRINTF("Before raising %s from child\n", strsignal(sigval));
2925		FORKEE_ASSERT(raise(sigval) == 0);
2926
2927		FORKEE_ASSERT_EQ(lookup_me_totracee, magic_totracee);
2928
2929		DPRINTF("Before exiting of the child process\n");
2930		_exit(exitval);
2931	}
2932	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
2933
2934	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2935	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
2936
2937	validate_status_stopped(status, sigval);
2938
2939	lookup_me_totracee = magic_totracee;
2940
2941	DPRINTF("Write lookup_me_totracee to PID=%d by tracer (PID=%d)\n",
2942	    child, getpid());
2943	SYSCALL_REQUIRE(ptrace(PT_IO, child, &io_totracee, 0) != -1);
2944
2945	ATF_REQUIRE_EQ_MSG(lookup_me_totracee, magic_totracee,
2946	    "got value %" PRIx8 " != expected %" PRIx8, lookup_me_totracee,
2947	    magic_totracee);
2948
2949	DPRINTF("Read lookup_me_fromtracee PID=%d by tracer (PID=%d)\n",
2950	    child, getpid());
2951	SYSCALL_REQUIRE(ptrace(PT_IO, child, &io_fromtracee, 0) != -1);
2952
2953	ATF_REQUIRE_EQ_MSG(lookup_me_fromtracee, magic_fromtracee,
2954	    "got value %" PRIx8 " != expected %" PRIx8, lookup_me_fromtracee,
2955	    magic_fromtracee);
2956
2957	DPRINTF("Before resuming the child process where it left off and "
2958	    "without signal to be sent\n");
2959	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
2960
2961	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2962	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
2963
2964	validate_status_exited(status, exitval);
2965
2966	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
2967	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
2968}
2969
2970ATF_TC(read_d_write_d_handshake1);
2971ATF_TC_HEAD(read_d_write_d_handshake1, tc)
2972{
2973	atf_tc_set_md_var(tc, "descr",
2974	    "Verify PT_READ_D with PT_WRITE_D handshake");
2975}
2976
2977ATF_TC_BODY(read_d_write_d_handshake1, tc)
2978{
2979	const int exitval = 5;
2980	const int sigval = SIGSTOP;
2981	pid_t child, wpid;
2982	int lookup_me_fromtracee = 0;
2983	const int magic_fromtracee = (int)random();
2984	int lookup_me_totracee = 0;
2985	const int magic_totracee = (int)random();
2986#if defined(TWAIT_HAVE_STATUS)
2987	int status;
2988#endif
2989
2990	DPRINTF("Before forking process PID=%d\n", getpid());
2991	SYSCALL_REQUIRE((child = fork()) != -1);
2992	if (child == 0) {
2993		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
2994		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
2995
2996		lookup_me_fromtracee = magic_fromtracee;
2997
2998		DPRINTF("Before raising %s from child\n", strsignal(sigval));
2999		FORKEE_ASSERT(raise(sigval) == 0);
3000
3001		FORKEE_ASSERT_EQ(lookup_me_totracee, magic_totracee);
3002
3003		DPRINTF("Before exiting of the child process\n");
3004		_exit(exitval);
3005	}
3006	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
3007
3008	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3009	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3010
3011	validate_status_stopped(status, sigval);
3012
3013	DPRINTF("Read new lookup_me_fromtracee PID=%d by tracer (PID=%d)\n",
3014	    child, getpid());
3015	errno = 0;
3016	lookup_me_fromtracee =
3017	    ptrace(PT_READ_D, child, &lookup_me_fromtracee, 0);
3018	SYSCALL_REQUIRE_ERRNO(errno, 0);
3019
3020	ATF_REQUIRE_EQ_MSG(lookup_me_fromtracee, magic_fromtracee,
3021	    "got value %#x != expected %#x", lookup_me_fromtracee,
3022	    magic_fromtracee);
3023
3024	DPRINTF("Write new lookup_me_totracee to PID=%d from tracer (PID=%d)\n",
3025	    child, getpid());
3026	ATF_REQUIRE
3027	    (ptrace(PT_WRITE_D, child, &lookup_me_totracee, magic_totracee)
3028	    != -1);
3029
3030	DPRINTF("Before resuming the child process where it left off and "
3031	    "without signal to be sent\n");
3032	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
3033
3034	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3035	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3036
3037	validate_status_exited(status, exitval);
3038
3039	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3040	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
3041}
3042
3043ATF_TC(read_d_write_d_handshake2);
3044ATF_TC_HEAD(read_d_write_d_handshake2, tc)
3045{
3046	atf_tc_set_md_var(tc, "descr",
3047	    "Verify PT_WRITE_D with PT_READ_D handshake");
3048}
3049
3050ATF_TC_BODY(read_d_write_d_handshake2, tc)
3051{
3052	const int exitval = 5;
3053	const int sigval = SIGSTOP;
3054	pid_t child, wpid;
3055	int lookup_me_fromtracee = 0;
3056	const int magic_fromtracee = (int)random();
3057	int lookup_me_totracee = 0;
3058	const int magic_totracee = (int)random();
3059#if defined(TWAIT_HAVE_STATUS)
3060	int status;
3061#endif
3062
3063	DPRINTF("Before forking process PID=%d\n", getpid());
3064	SYSCALL_REQUIRE((child = fork()) != -1);
3065	if (child == 0) {
3066		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
3067		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
3068
3069		lookup_me_fromtracee = magic_fromtracee;
3070
3071		DPRINTF("Before raising %s from child\n", strsignal(sigval));
3072		FORKEE_ASSERT(raise(sigval) == 0);
3073
3074		FORKEE_ASSERT_EQ(lookup_me_totracee, magic_totracee);
3075
3076		DPRINTF("Before exiting of the child process\n");
3077		_exit(exitval);
3078	}
3079	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
3080
3081	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3082	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3083
3084	validate_status_stopped(status, sigval);
3085
3086	DPRINTF("Write new lookup_me_totracee to PID=%d from tracer (PID=%d)\n",
3087	    child, getpid());
3088	ATF_REQUIRE
3089	    (ptrace(PT_WRITE_D, child, &lookup_me_totracee, magic_totracee)
3090	    != -1);
3091
3092	DPRINTF("Read new lookup_me_fromtracee PID=%d by tracer (PID=%d)\n",
3093	    child, getpid());
3094	errno = 0;
3095	lookup_me_fromtracee =
3096	    ptrace(PT_READ_D, child, &lookup_me_fromtracee, 0);
3097	SYSCALL_REQUIRE_ERRNO(errno, 0);
3098
3099	ATF_REQUIRE_EQ_MSG(lookup_me_fromtracee, magic_fromtracee,
3100	    "got value %#x != expected %#x", lookup_me_fromtracee,
3101	    magic_fromtracee);
3102
3103	DPRINTF("Before resuming the child process where it left off and "
3104	    "without signal to be sent\n");
3105	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
3106
3107	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3108	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3109
3110	validate_status_exited(status, exitval);
3111
3112	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3113	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
3114}
3115
3116/* These dummy functions are used to be copied with ptrace(2) calls */
3117static int __used
3118dummy_fn1(int a, int b, int c, int d)
3119{
3120
3121	a *= 1;
3122	b += 2;
3123	c -= 3;
3124	d /= 4;
3125
3126	return a + b * c - d;
3127}
3128
3129static int __used
3130dummy_fn2(int a, int b, int c, int d)
3131{
3132
3133	a *= 4;
3134	b += 3;
3135	c -= 2;
3136	d /= 1;
3137
3138	return a + b * c - d;
3139}
3140
3141static int __used
3142dummy_fn3(int a, int b, int c, int d)
3143{
3144
3145	a *= 10;
3146	b += 20;
3147	c -= 30;
3148	d /= 40;
3149
3150	return a + b * c - d;
3151}
3152
3153static int __used
3154dummy_fn4(int a, int b, int c, int d)
3155{
3156
3157	a *= 40;
3158	b += 30;
3159	c -= 20;
3160	d /= 10;
3161
3162	return a + b * c - d;
3163}
3164
3165ATF_TC(io_read_i1);
3166ATF_TC_HEAD(io_read_i1, tc)
3167{
3168	atf_tc_set_md_var(tc, "descr",
3169	    "Verify PT_IO with PIOD_READ_I and len = sizeof(uint8_t)");
3170}
3171
3172ATF_TC_BODY(io_read_i1, tc)
3173{
3174	const int exitval = 5;
3175	const int sigval = SIGSTOP;
3176	pid_t child, wpid;
3177	uint8_t lookup_me = 0;
3178	uint8_t magic;
3179	memcpy(&magic, dummy_fn1, sizeof(magic));
3180	struct ptrace_io_desc io = {
3181		.piod_op = PIOD_READ_I,
3182		.piod_offs = dummy_fn1,
3183		.piod_addr = &lookup_me,
3184		.piod_len = sizeof(lookup_me)
3185	};
3186#if defined(TWAIT_HAVE_STATUS)
3187	int status;
3188#endif
3189
3190	DPRINTF("Before forking process PID=%d\n", getpid());
3191	SYSCALL_REQUIRE((child = fork()) != -1);
3192	if (child == 0) {
3193		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
3194		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
3195
3196		DPRINTF("Before raising %s from child\n", strsignal(sigval));
3197		FORKEE_ASSERT(raise(sigval) == 0);
3198
3199		DPRINTF("Before exiting of the child process\n");
3200		_exit(exitval);
3201	}
3202	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
3203
3204	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3205	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3206
3207	validate_status_stopped(status, sigval);
3208
3209	DPRINTF("Read lookup_me from tracee (PID=%d) by tracer (PID=%d)\n",
3210	    child, getpid());
3211	SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1);
3212
3213	ATF_REQUIRE_EQ_MSG(lookup_me, magic,
3214	    "got value %" PRIx8 " != expected %" PRIx8, lookup_me, magic);
3215
3216	DPRINTF("Before resuming the child process where it left off and "
3217	    "without signal to be sent\n");
3218	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
3219
3220	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3221	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3222
3223	validate_status_exited(status, exitval);
3224
3225	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3226	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
3227}
3228
3229ATF_TC(io_read_i2);
3230ATF_TC_HEAD(io_read_i2, tc)
3231{
3232	atf_tc_set_md_var(tc, "descr",
3233	    "Verify PT_IO with PIOD_READ_I and len = sizeof(uint16_t)");
3234}
3235
3236ATF_TC_BODY(io_read_i2, tc)
3237{
3238	const int exitval = 5;
3239	const int sigval = SIGSTOP;
3240	pid_t child, wpid;
3241	uint16_t lookup_me = 0;
3242	uint16_t magic;
3243	memcpy(&magic, dummy_fn1, sizeof(magic));
3244	struct ptrace_io_desc io = {
3245		.piod_op = PIOD_READ_I,
3246		.piod_offs = dummy_fn1,
3247		.piod_addr = &lookup_me,
3248		.piod_len = sizeof(lookup_me)
3249	};
3250#if defined(TWAIT_HAVE_STATUS)
3251	int status;
3252#endif
3253
3254	DPRINTF("Before forking process PID=%d\n", getpid());
3255	SYSCALL_REQUIRE((child = fork()) != -1);
3256	if (child == 0) {
3257		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
3258		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
3259
3260		DPRINTF("Before raising %s from child\n", strsignal(sigval));
3261		FORKEE_ASSERT(raise(sigval) == 0);
3262
3263		DPRINTF("Before exiting of the child process\n");
3264		_exit(exitval);
3265	}
3266	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
3267
3268	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3269	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3270
3271	validate_status_stopped(status, sigval);
3272
3273	DPRINTF("Read lookup_me from tracee (PID=%d) by tracer (PID=%d)\n",
3274	    child, getpid());
3275	SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1);
3276
3277	ATF_REQUIRE_EQ_MSG(lookup_me, magic,
3278	    "got value %" PRIx16 " != expected %" PRIx16, lookup_me, magic);
3279
3280	DPRINTF("Before resuming the child process where it left off and "
3281	    "without signal to be sent\n");
3282	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
3283
3284	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3285	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3286
3287	validate_status_exited(status, exitval);
3288
3289	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3290	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
3291}
3292
3293ATF_TC(io_read_i3);
3294ATF_TC_HEAD(io_read_i3, tc)
3295{
3296	atf_tc_set_md_var(tc, "descr",
3297	    "Verify PT_IO with PIOD_READ_I and len = sizeof(uint32_t)");
3298}
3299
3300ATF_TC_BODY(io_read_i3, tc)
3301{
3302	const int exitval = 5;
3303	const int sigval = SIGSTOP;
3304	pid_t child, wpid;
3305	uint32_t lookup_me = 0;
3306	uint32_t magic;
3307	memcpy(&magic, dummy_fn1, sizeof(magic));
3308	struct ptrace_io_desc io = {
3309		.piod_op = PIOD_READ_I,
3310		.piod_offs = dummy_fn1,
3311		.piod_addr = &lookup_me,
3312		.piod_len = sizeof(lookup_me)
3313	};
3314#if defined(TWAIT_HAVE_STATUS)
3315	int status;
3316#endif
3317
3318	DPRINTF("Before forking process PID=%d\n", getpid());
3319	SYSCALL_REQUIRE((child = fork()) != -1);
3320	if (child == 0) {
3321		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
3322		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
3323
3324		DPRINTF("Before raising %s from child\n", strsignal(sigval));
3325		FORKEE_ASSERT(raise(sigval) == 0);
3326
3327		DPRINTF("Before exiting of the child process\n");
3328		_exit(exitval);
3329	}
3330	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
3331
3332	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3333	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3334
3335	validate_status_stopped(status, sigval);
3336
3337	DPRINTF("Read lookup_me from tracee (PID=%d) by tracer (PID=%d)\n",
3338	    child, getpid());
3339	SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1);
3340
3341	ATF_REQUIRE_EQ_MSG(lookup_me, magic,
3342	    "got value %" PRIx32 " != expected %" PRIx32, lookup_me, magic);
3343
3344	DPRINTF("Before resuming the child process where it left off and "
3345	    "without signal to be sent\n");
3346	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
3347
3348	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3349	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3350
3351	validate_status_exited(status, exitval);
3352
3353	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3354	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
3355}
3356
3357ATF_TC(io_read_i4);
3358ATF_TC_HEAD(io_read_i4, tc)
3359{
3360	atf_tc_set_md_var(tc, "descr",
3361	    "Verify PT_IO with PIOD_READ_I and len = sizeof(uint64_t)");
3362}
3363
3364ATF_TC_BODY(io_read_i4, tc)
3365{
3366	const int exitval = 5;
3367	const int sigval = SIGSTOP;
3368	pid_t child, wpid;
3369	uint64_t lookup_me = 0;
3370	uint64_t magic;
3371	memcpy(&magic, dummy_fn1, sizeof(magic));
3372	struct ptrace_io_desc io = {
3373		.piod_op = PIOD_READ_I,
3374		.piod_offs = dummy_fn1,
3375		.piod_addr = &lookup_me,
3376		.piod_len = sizeof(lookup_me)
3377	};
3378#if defined(TWAIT_HAVE_STATUS)
3379	int status;
3380#endif
3381
3382	DPRINTF("Before forking process PID=%d\n", getpid());
3383	SYSCALL_REQUIRE((child = fork()) != -1);
3384	if (child == 0) {
3385		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
3386		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
3387
3388		DPRINTF("Before raising %s from child\n", strsignal(sigval));
3389		FORKEE_ASSERT(raise(sigval) == 0);
3390
3391		DPRINTF("Before exiting of the child process\n");
3392		_exit(exitval);
3393	}
3394	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
3395
3396	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3397	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3398
3399	validate_status_stopped(status, sigval);
3400
3401	DPRINTF("Read lookup_me from tracee (PID=%d) by tracer (PID=%d)\n",
3402	    child, getpid());
3403	SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1);
3404
3405	ATF_REQUIRE_EQ_MSG(lookup_me, magic,
3406	    "got value %" PRIx64 " != expected %" PRIx64, lookup_me, magic);
3407
3408	DPRINTF("Before resuming the child process where it left off and "
3409	    "without signal to be sent\n");
3410	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
3411
3412	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3413	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3414
3415	validate_status_exited(status, exitval);
3416
3417	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3418	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
3419}
3420
3421ATF_TC(read_i1);
3422ATF_TC_HEAD(read_i1, tc)
3423{
3424	atf_tc_set_md_var(tc, "descr",
3425	    "Verify PT_READ_I called once");
3426}
3427
3428ATF_TC_BODY(read_i1, tc)
3429{
3430	const int exitval = 5;
3431	const int sigval = SIGSTOP;
3432	pid_t child, wpid;
3433	int lookup_me = 0;
3434	int magic;
3435	memcpy(&magic, dummy_fn1, sizeof(magic));
3436#if defined(TWAIT_HAVE_STATUS)
3437	int status;
3438#endif
3439
3440	DPRINTF("Before forking process PID=%d\n", getpid());
3441	SYSCALL_REQUIRE((child = fork()) != -1);
3442	if (child == 0) {
3443		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
3444		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
3445
3446		DPRINTF("Before raising %s from child\n", strsignal(sigval));
3447		FORKEE_ASSERT(raise(sigval) == 0);
3448
3449		DPRINTF("Before exiting of the child process\n");
3450		_exit(exitval);
3451	}
3452	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
3453
3454	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3455	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3456
3457	validate_status_stopped(status, sigval);
3458
3459	DPRINTF("Read new lookup_me from tracee (PID=%d) by tracer (PID=%d)\n",
3460	    child, getpid());
3461	errno = 0;
3462	lookup_me = ptrace(PT_READ_I, child, dummy_fn1, 0);
3463	SYSCALL_REQUIRE_ERRNO(errno, 0);
3464
3465	ATF_REQUIRE_EQ_MSG(lookup_me, magic,
3466	    "got value %#x != expected %#x", lookup_me, magic);
3467
3468	DPRINTF("Before resuming the child process where it left off and "
3469	    "without signal to be sent\n");
3470	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
3471
3472	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3473	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3474
3475	validate_status_exited(status, exitval);
3476
3477	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3478	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
3479}
3480
3481ATF_TC(read_i2);
3482ATF_TC_HEAD(read_i2, tc)
3483{
3484	atf_tc_set_md_var(tc, "descr",
3485	    "Verify PT_READ_I called twice");
3486}
3487
3488ATF_TC_BODY(read_i2, tc)
3489{
3490	const int exitval = 5;
3491	const int sigval = SIGSTOP;
3492	pid_t child, wpid;
3493	int lookup_me1 = 0;
3494	int lookup_me2 = 0;
3495	int magic1;
3496	int magic2;
3497	memcpy(&magic1, dummy_fn1, sizeof(magic1));
3498	memcpy(&magic2, dummy_fn2, sizeof(magic2));
3499#if defined(TWAIT_HAVE_STATUS)
3500	int status;
3501#endif
3502
3503	DPRINTF("Before forking process PID=%d\n", getpid());
3504	SYSCALL_REQUIRE((child = fork()) != -1);
3505	if (child == 0) {
3506		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
3507		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
3508
3509		DPRINTF("Before raising %s from child\n", strsignal(sigval));
3510		FORKEE_ASSERT(raise(sigval) == 0);
3511
3512		DPRINTF("Before exiting of the child process\n");
3513		_exit(exitval);
3514	}
3515	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
3516
3517	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3518	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3519
3520	validate_status_stopped(status, sigval);
3521
3522	DPRINTF("Read new lookup_me1 from tracee (PID=%d) by tracer (PID=%d)\n",
3523	    child, getpid());
3524	errno = 0;
3525	lookup_me1 = ptrace(PT_READ_I, child, dummy_fn1, 0);
3526	SYSCALL_REQUIRE_ERRNO(errno, 0);
3527
3528	ATF_REQUIRE_EQ_MSG(lookup_me1, magic1,
3529	    "got value %#x != expected %#x", lookup_me1, magic1);
3530
3531	DPRINTF("Read new lookup_me2 from tracee (PID=%d) by tracer (PID=%d)\n",
3532	    child, getpid());
3533	errno = 0;
3534	lookup_me2 = ptrace(PT_READ_I, child, dummy_fn2, 0);
3535	SYSCALL_REQUIRE_ERRNO(errno, 0);
3536
3537	ATF_REQUIRE_EQ_MSG(lookup_me2, magic2,
3538	    "got value %#x != expected %#x", lookup_me2, magic2);
3539
3540	DPRINTF("Before resuming the child process where it left off and "
3541	    "without signal to be sent\n");
3542	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
3543
3544	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3545	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3546
3547	validate_status_exited(status, exitval);
3548
3549	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3550	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
3551}
3552
3553ATF_TC(read_i3);
3554ATF_TC_HEAD(read_i3, tc)
3555{
3556	atf_tc_set_md_var(tc, "descr",
3557	    "Verify PT_READ_I called three times");
3558}
3559
3560ATF_TC_BODY(read_i3, tc)
3561{
3562	const int exitval = 5;
3563	const int sigval = SIGSTOP;
3564	pid_t child, wpid;
3565	int lookup_me1 = 0;
3566	int lookup_me2 = 0;
3567	int lookup_me3 = 0;
3568	int magic1;
3569	int magic2;
3570	int magic3;
3571	memcpy(&magic1, dummy_fn1, sizeof(magic1));
3572	memcpy(&magic2, dummy_fn2, sizeof(magic2));
3573	memcpy(&magic3, dummy_fn3, sizeof(magic3));
3574#if defined(TWAIT_HAVE_STATUS)
3575	int status;
3576#endif
3577
3578	DPRINTF("Before forking process PID=%d\n", getpid());
3579	SYSCALL_REQUIRE((child = fork()) != -1);
3580	if (child == 0) {
3581		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
3582		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
3583
3584		DPRINTF("Before raising %s from child\n", strsignal(sigval));
3585		FORKEE_ASSERT(raise(sigval) == 0);
3586
3587		DPRINTF("Before exiting of the child process\n");
3588		_exit(exitval);
3589	}
3590	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
3591
3592	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3593	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3594
3595	validate_status_stopped(status, sigval);
3596
3597	DPRINTF("Read new lookup_me1 from tracee (PID=%d) by tracer (PID=%d)\n",
3598	    child, getpid());
3599	errno = 0;
3600	lookup_me1 = ptrace(PT_READ_I, child, dummy_fn1, 0);
3601	SYSCALL_REQUIRE_ERRNO(errno, 0);
3602
3603	ATF_REQUIRE_EQ_MSG(lookup_me1, magic1,
3604	    "got value %#x != expected %#x", lookup_me1, magic1);
3605
3606	DPRINTF("Read new lookup_me2 from tracee (PID=%d) by tracer (PID=%d)\n",
3607	    child, getpid());
3608	errno = 0;
3609	lookup_me2 = ptrace(PT_READ_I, child, dummy_fn2, 0);
3610	SYSCALL_REQUIRE_ERRNO(errno, 0);
3611
3612	ATF_REQUIRE_EQ_MSG(lookup_me2, magic2,
3613	    "got value %#x != expected %#x", lookup_me2, magic2);
3614
3615	DPRINTF("Read new lookup_me3 from tracee (PID=%d) by tracer (PID=%d)\n",
3616	    child, getpid());
3617	errno = 0;
3618	lookup_me3 = ptrace(PT_READ_I, child, dummy_fn3, 0);
3619	SYSCALL_REQUIRE_ERRNO(errno, 0);
3620
3621	ATF_REQUIRE_EQ_MSG(lookup_me3, magic3,
3622	    "got value %#x != expected %#x", lookup_me3, magic3);
3623
3624	DPRINTF("Before resuming the child process where it left off and "
3625	    "without signal to be sent\n");
3626	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
3627
3628	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3629	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3630
3631	validate_status_exited(status, exitval);
3632
3633	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3634	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
3635}
3636
3637ATF_TC(read_i4);
3638ATF_TC_HEAD(read_i4, tc)
3639{
3640	atf_tc_set_md_var(tc, "descr",
3641	    "Verify PT_READ_I called four times");
3642}
3643
3644ATF_TC_BODY(read_i4, tc)
3645{
3646	const int exitval = 5;
3647	const int sigval = SIGSTOP;
3648	pid_t child, wpid;
3649	int lookup_me1 = 0;
3650	int lookup_me2 = 0;
3651	int lookup_me3 = 0;
3652	int lookup_me4 = 0;
3653	int magic1;
3654	int magic2;
3655	int magic3;
3656	int magic4;
3657	memcpy(&magic1, dummy_fn1, sizeof(magic1));
3658	memcpy(&magic2, dummy_fn2, sizeof(magic2));
3659	memcpy(&magic3, dummy_fn3, sizeof(magic3));
3660	memcpy(&magic4, dummy_fn4, sizeof(magic4));
3661#if defined(TWAIT_HAVE_STATUS)
3662	int status;
3663#endif
3664
3665	DPRINTF("Before forking process PID=%d\n", getpid());
3666	SYSCALL_REQUIRE((child = fork()) != -1);
3667	if (child == 0) {
3668		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
3669		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
3670
3671		DPRINTF("Before raising %s from child\n", strsignal(sigval));
3672		FORKEE_ASSERT(raise(sigval) == 0);
3673
3674		DPRINTF("Before exiting of the child process\n");
3675		_exit(exitval);
3676	}
3677	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
3678
3679	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3680	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3681
3682	validate_status_stopped(status, sigval);
3683
3684	DPRINTF("Read new lookup_me1 from tracee (PID=%d) by tracer (PID=%d)\n",
3685	    child, getpid());
3686	errno = 0;
3687	lookup_me1 = ptrace(PT_READ_I, child, dummy_fn1, 0);
3688	SYSCALL_REQUIRE_ERRNO(errno, 0);
3689
3690	ATF_REQUIRE_EQ_MSG(lookup_me1, magic1,
3691	    "got value %#x != expected %#x", lookup_me1, magic1);
3692
3693	DPRINTF("Read new lookup_me2 from tracee (PID=%d) by tracer (PID=%d)\n",
3694	    child, getpid());
3695	errno = 0;
3696	lookup_me2 = ptrace(PT_READ_I, child, dummy_fn2, 0);
3697	SYSCALL_REQUIRE_ERRNO(errno, 0);
3698
3699	ATF_REQUIRE_EQ_MSG(lookup_me2, magic2,
3700	    "got value %#x != expected %#x", lookup_me2, magic2);
3701
3702	DPRINTF("Read new lookup_me3 from tracee (PID=%d) by tracer (PID=%d)\n",
3703	    child, getpid());
3704	errno = 0;
3705	lookup_me3 = ptrace(PT_READ_I, child, dummy_fn3, 0);
3706	SYSCALL_REQUIRE_ERRNO(errno, 0);
3707
3708	ATF_REQUIRE_EQ_MSG(lookup_me3, magic3,
3709	    "got value %#x != expected %#x", lookup_me3, magic3);
3710
3711	DPRINTF("Read new lookup_me4 from tracee (PID=%d) by tracer (PID=%d)\n",
3712	    child, getpid());
3713	errno = 0;
3714	lookup_me4 = ptrace(PT_READ_I, child, dummy_fn4, 0);
3715	SYSCALL_REQUIRE_ERRNO(errno, 0);
3716
3717	ATF_REQUIRE_EQ_MSG(lookup_me4, magic4,
3718	    "got value %#x != expected %#x", lookup_me4, magic4);
3719
3720	DPRINTF("Before resuming the child process where it left off and "
3721	    "without signal to be sent\n");
3722	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
3723
3724	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3725	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3726
3727	validate_status_exited(status, exitval);
3728
3729	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3730	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
3731}
3732
3733#if defined(HAVE_GPREGS)
3734ATF_TC(regs1);
3735ATF_TC_HEAD(regs1, tc)
3736{
3737	atf_tc_set_md_var(tc, "descr",
3738	    "Verify plain PT_GETREGS call without further steps");
3739}
3740
3741ATF_TC_BODY(regs1, tc)
3742{
3743	const int exitval = 5;
3744	const int sigval = SIGSTOP;
3745	pid_t child, wpid;
3746#if defined(TWAIT_HAVE_STATUS)
3747	int status;
3748#endif
3749	struct reg r;
3750
3751	DPRINTF("Before forking process PID=%d\n", getpid());
3752	SYSCALL_REQUIRE((child = fork()) != -1);
3753	if (child == 0) {
3754		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
3755		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
3756
3757		DPRINTF("Before raising %s from child\n", strsignal(sigval));
3758		FORKEE_ASSERT(raise(sigval) == 0);
3759
3760		DPRINTF("Before exiting of the child process\n");
3761		_exit(exitval);
3762	}
3763	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
3764
3765	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3766	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3767
3768	validate_status_stopped(status, sigval);
3769
3770	DPRINTF("Call GETREGS for the child process\n");
3771	SYSCALL_REQUIRE(ptrace(PT_GETREGS, child, &r, 0) != -1);
3772
3773	DPRINTF("Before resuming the child process where it left off and "
3774	    "without signal to be sent\n");
3775	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
3776
3777	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3778	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3779
3780	validate_status_exited(status, exitval);
3781
3782	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3783	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
3784}
3785#endif
3786
3787#if defined(HAVE_GPREGS)
3788ATF_TC(regs2);
3789ATF_TC_HEAD(regs2, tc)
3790{
3791	atf_tc_set_md_var(tc, "descr",
3792	    "Verify plain PT_GETREGS call and retrieve PC");
3793}
3794
3795ATF_TC_BODY(regs2, tc)
3796{
3797	const int exitval = 5;
3798	const int sigval = SIGSTOP;
3799	pid_t child, wpid;
3800#if defined(TWAIT_HAVE_STATUS)
3801	int status;
3802#endif
3803	struct reg r;
3804
3805	DPRINTF("Before forking process PID=%d\n", getpid());
3806	SYSCALL_REQUIRE((child = fork()) != -1);
3807	if (child == 0) {
3808		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
3809		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
3810
3811		DPRINTF("Before raising %s from child\n", strsignal(sigval));
3812		FORKEE_ASSERT(raise(sigval) == 0);
3813
3814		DPRINTF("Before exiting of the child process\n");
3815		_exit(exitval);
3816	}
3817	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
3818
3819	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3820	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3821
3822	validate_status_stopped(status, sigval);
3823
3824	DPRINTF("Call GETREGS for the child process\n");
3825	SYSCALL_REQUIRE(ptrace(PT_GETREGS, child, &r, 0) != -1);
3826
3827	DPRINTF("Retrieved PC=%" PRIxREGISTER "\n", PTRACE_REG_PC(&r));
3828
3829	DPRINTF("Before resuming the child process where it left off and "
3830	    "without signal to be sent\n");
3831	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
3832
3833	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3834	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3835
3836	validate_status_exited(status, exitval);
3837
3838	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3839	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
3840}
3841#endif
3842
3843#if defined(HAVE_GPREGS)
3844ATF_TC(regs3);
3845ATF_TC_HEAD(regs3, tc)
3846{
3847	atf_tc_set_md_var(tc, "descr",
3848	    "Verify plain PT_GETREGS call and retrieve SP");
3849}
3850
3851ATF_TC_BODY(regs3, tc)
3852{
3853	const int exitval = 5;
3854	const int sigval = SIGSTOP;
3855	pid_t child, wpid;
3856#if defined(TWAIT_HAVE_STATUS)
3857	int status;
3858#endif
3859	struct reg r;
3860
3861	DPRINTF("Before forking process PID=%d\n", getpid());
3862	SYSCALL_REQUIRE((child = fork()) != -1);
3863	if (child == 0) {
3864		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
3865		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
3866
3867		DPRINTF("Before raising %s from child\n", strsignal(sigval));
3868		FORKEE_ASSERT(raise(sigval) == 0);
3869
3870		DPRINTF("Before exiting of the child process\n");
3871		_exit(exitval);
3872	}
3873	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
3874
3875	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3876	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3877
3878	validate_status_stopped(status, sigval);
3879
3880	DPRINTF("Call GETREGS for the child process\n");
3881	SYSCALL_REQUIRE(ptrace(PT_GETREGS, child, &r, 0) != -1);
3882
3883	DPRINTF("Retrieved SP=%" PRIxREGISTER "\n", PTRACE_REG_SP(&r));
3884
3885	DPRINTF("Before resuming the child process where it left off and "
3886	    "without signal to be sent\n");
3887	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
3888
3889	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3890	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3891
3892	validate_status_exited(status, exitval);
3893
3894	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3895	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
3896}
3897#endif
3898
3899#if defined(HAVE_GPREGS)
3900ATF_TC(regs4);
3901ATF_TC_HEAD(regs4, tc)
3902{
3903	atf_tc_set_md_var(tc, "descr",
3904	    "Verify plain PT_GETREGS call and retrieve INTRV");
3905}
3906
3907ATF_TC_BODY(regs4, tc)
3908{
3909	const int exitval = 5;
3910	const int sigval = SIGSTOP;
3911	pid_t child, wpid;
3912#if defined(TWAIT_HAVE_STATUS)
3913	int status;
3914#endif
3915	struct reg r;
3916
3917	DPRINTF("Before forking process PID=%d\n", getpid());
3918	SYSCALL_REQUIRE((child = fork()) != -1);
3919	if (child == 0) {
3920		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
3921		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
3922
3923		DPRINTF("Before raising %s from child\n", strsignal(sigval));
3924		FORKEE_ASSERT(raise(sigval) == 0);
3925
3926		DPRINTF("Before exiting of the child process\n");
3927		_exit(exitval);
3928	}
3929	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
3930
3931	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3932	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3933
3934	validate_status_stopped(status, sigval);
3935
3936	DPRINTF("Call GETREGS for the child process\n");
3937	SYSCALL_REQUIRE(ptrace(PT_GETREGS, child, &r, 0) != -1);
3938
3939	DPRINTF("Retrieved INTRV=%" PRIxREGISTER "\n", PTRACE_REG_INTRV(&r));
3940
3941	DPRINTF("Before resuming the child process where it left off and "
3942	    "without signal to be sent\n");
3943	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
3944
3945	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3946	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3947
3948	validate_status_exited(status, exitval);
3949
3950	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3951	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
3952}
3953#endif
3954
3955#if defined(HAVE_GPREGS)
3956ATF_TC(regs5);
3957ATF_TC_HEAD(regs5, tc)
3958{
3959	atf_tc_set_md_var(tc, "descr",
3960	    "Verify PT_GETREGS and PT_SETREGS calls without changing regs");
3961}
3962
3963ATF_TC_BODY(regs5, tc)
3964{
3965	const int exitval = 5;
3966	const int sigval = SIGSTOP;
3967	pid_t child, wpid;
3968#if defined(TWAIT_HAVE_STATUS)
3969	int status;
3970#endif
3971	struct reg r;
3972
3973	DPRINTF("Before forking process PID=%d\n", getpid());
3974	SYSCALL_REQUIRE((child = fork()) != -1);
3975	if (child == 0) {
3976		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
3977		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
3978
3979		DPRINTF("Before raising %s from child\n", strsignal(sigval));
3980		FORKEE_ASSERT(raise(sigval) == 0);
3981
3982		DPRINTF("Before exiting of the child process\n");
3983		_exit(exitval);
3984	}
3985	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
3986
3987	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
3988	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
3989
3990	validate_status_stopped(status, sigval);
3991
3992	DPRINTF("Call GETREGS for the child process\n");
3993	SYSCALL_REQUIRE(ptrace(PT_GETREGS, child, &r, 0) != -1);
3994
3995	DPRINTF("Call SETREGS for the child process (without changed regs)\n");
3996	SYSCALL_REQUIRE(ptrace(PT_GETREGS, child, &r, 0) != -1);
3997
3998	DPRINTF("Before resuming the child process where it left off and "
3999	    "without signal to be sent\n");
4000	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
4001
4002	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4003	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
4004
4005	validate_status_exited(status, exitval);
4006
4007	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4008	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
4009}
4010#endif
4011
4012#if defined(HAVE_FPREGS)
4013ATF_TC(fpregs1);
4014ATF_TC_HEAD(fpregs1, tc)
4015{
4016	atf_tc_set_md_var(tc, "descr",
4017	    "Verify plain PT_GETFPREGS call without further steps");
4018}
4019
4020ATF_TC_BODY(fpregs1, tc)
4021{
4022	const int exitval = 5;
4023	const int sigval = SIGSTOP;
4024	pid_t child, wpid;
4025#if defined(TWAIT_HAVE_STATUS)
4026	int status;
4027#endif
4028	struct fpreg r;
4029
4030	DPRINTF("Before forking process PID=%d\n", getpid());
4031	SYSCALL_REQUIRE((child = fork()) != -1);
4032	if (child == 0) {
4033		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
4034		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
4035
4036		DPRINTF("Before raising %s from child\n", strsignal(sigval));
4037		FORKEE_ASSERT(raise(sigval) == 0);
4038
4039		DPRINTF("Before exiting of the child process\n");
4040		_exit(exitval);
4041	}
4042	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
4043
4044	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4045	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
4046
4047	validate_status_stopped(status, sigval);
4048
4049	DPRINTF("Call GETFPREGS for the child process\n");
4050	SYSCALL_REQUIRE(ptrace(PT_GETFPREGS, child, &r, 0) != -1);
4051
4052	DPRINTF("Before resuming the child process where it left off and "
4053	    "without signal to be sent\n");
4054	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
4055
4056	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4057	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
4058
4059	validate_status_exited(status, exitval);
4060
4061	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4062	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
4063}
4064#endif
4065
4066#if defined(HAVE_FPREGS)
4067ATF_TC(fpregs2);
4068ATF_TC_HEAD(fpregs2, tc)
4069{
4070	atf_tc_set_md_var(tc, "descr",
4071	    "Verify PT_GETFPREGS and PT_SETFPREGS calls without changing "
4072	    "regs");
4073}
4074
4075ATF_TC_BODY(fpregs2, tc)
4076{
4077	const int exitval = 5;
4078	const int sigval = SIGSTOP;
4079	pid_t child, wpid;
4080#if defined(TWAIT_HAVE_STATUS)
4081	int status;
4082#endif
4083	struct fpreg r;
4084
4085	DPRINTF("Before forking process PID=%d\n", getpid());
4086	SYSCALL_REQUIRE((child = fork()) != -1);
4087	if (child == 0) {
4088		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
4089		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
4090
4091		DPRINTF("Before raising %s from child\n", strsignal(sigval));
4092		FORKEE_ASSERT(raise(sigval) == 0);
4093
4094		DPRINTF("Before exiting of the child process\n");
4095		_exit(exitval);
4096	}
4097	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
4098
4099	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4100	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
4101
4102	validate_status_stopped(status, sigval);
4103
4104	DPRINTF("Call GETFPREGS for the child process\n");
4105	SYSCALL_REQUIRE(ptrace(PT_GETFPREGS, child, &r, 0) != -1);
4106
4107	DPRINTF("Call SETFPREGS for the child (without changed regs)\n");
4108	SYSCALL_REQUIRE(ptrace(PT_SETFPREGS, child, &r, 0) != -1);
4109
4110	DPRINTF("Before resuming the child process where it left off and "
4111	    "without signal to be sent\n");
4112	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
4113
4114	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4115	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
4116
4117	validate_status_exited(status, exitval);
4118
4119	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4120	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
4121}
4122#endif
4123
4124#if defined(PT_STEP)
4125static void
4126ptrace_step(int N, int setstep)
4127{
4128	const int exitval = 5;
4129	const int sigval = SIGSTOP;
4130	pid_t child, wpid;
4131#if defined(TWAIT_HAVE_STATUS)
4132	int status;
4133#endif
4134	int happy;
4135
4136#if defined(__arm__)
4137	/* PT_STEP not supported on arm 32-bit */
4138	atf_tc_expect_fail("PR kern/52119");
4139#endif
4140
4141	DPRINTF("Before forking process PID=%d\n", getpid());
4142	SYSCALL_REQUIRE((child = fork()) != -1);
4143	if (child == 0) {
4144		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
4145		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
4146
4147		happy = check_happy(999);
4148
4149		DPRINTF("Before raising %s from child\n", strsignal(sigval));
4150		FORKEE_ASSERT(raise(sigval) == 0);
4151
4152		FORKEE_ASSERT_EQ(happy, check_happy(999));
4153
4154		DPRINTF("Before exiting of the child process\n");
4155		_exit(exitval);
4156	}
4157	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
4158
4159	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4160	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
4161
4162	validate_status_stopped(status, sigval);
4163
4164	while (N --> 0) {
4165		if (setstep) {
4166			DPRINTF("Before resuming the child process where it "
4167			    "left off and without signal to be sent (use "
4168			    "PT_SETSTEP and PT_CONTINUE)\n");
4169			SYSCALL_REQUIRE(ptrace(PT_SETSTEP, child, 0, 0) != -1);
4170			SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0)
4171			    != -1);
4172		} else {
4173			DPRINTF("Before resuming the child process where it "
4174			    "left off and without signal to be sent (use "
4175			    "PT_STEP)\n");
4176			SYSCALL_REQUIRE(ptrace(PT_STEP, child, (void *)1, 0)
4177			    != -1);
4178		}
4179
4180		DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4181		TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0),
4182		    child);
4183
4184		validate_status_stopped(status, SIGTRAP);
4185
4186		if (setstep) {
4187			SYSCALL_REQUIRE(ptrace(PT_CLEARSTEP, child, 0, 0) != -1);
4188		}
4189	}
4190
4191	DPRINTF("Before resuming the child process where it left off and "
4192	    "without signal to be sent\n");
4193	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
4194
4195	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4196	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
4197
4198	validate_status_exited(status, exitval);
4199
4200	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4201	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
4202}
4203#endif
4204
4205#if defined(PT_STEP)
4206ATF_TC(step1);
4207ATF_TC_HEAD(step1, tc)
4208{
4209	atf_tc_set_md_var(tc, "descr",
4210	    "Verify single PT_STEP call");
4211}
4212
4213ATF_TC_BODY(step1, tc)
4214{
4215	ptrace_step(1, 0);
4216}
4217#endif
4218
4219#if defined(PT_STEP)
4220ATF_TC(step2);
4221ATF_TC_HEAD(step2, tc)
4222{
4223	atf_tc_set_md_var(tc, "descr",
4224	    "Verify PT_STEP called twice");
4225}
4226
4227ATF_TC_BODY(step2, tc)
4228{
4229	ptrace_step(2, 0);
4230}
4231#endif
4232
4233#if defined(PT_STEP)
4234ATF_TC(step3);
4235ATF_TC_HEAD(step3, tc)
4236{
4237	atf_tc_set_md_var(tc, "descr",
4238	    "Verify PT_STEP called three times");
4239}
4240
4241ATF_TC_BODY(step3, tc)
4242{
4243	ptrace_step(3, 0);
4244}
4245#endif
4246
4247#if defined(PT_STEP)
4248ATF_TC(step4);
4249ATF_TC_HEAD(step4, tc)
4250{
4251	atf_tc_set_md_var(tc, "descr",
4252	    "Verify PT_STEP called four times");
4253}
4254
4255ATF_TC_BODY(step4, tc)
4256{
4257	ptrace_step(4, 0);
4258}
4259#endif
4260
4261#if defined(PT_STEP)
4262ATF_TC(setstep1);
4263ATF_TC_HEAD(setstep1, tc)
4264{
4265	atf_tc_set_md_var(tc, "descr",
4266	    "Verify single PT_SETSTEP call");
4267}
4268
4269ATF_TC_BODY(setstep1, tc)
4270{
4271	ptrace_step(1, 1);
4272}
4273#endif
4274
4275#if defined(PT_STEP)
4276ATF_TC(setstep2);
4277ATF_TC_HEAD(setstep2, tc)
4278{
4279	atf_tc_set_md_var(tc, "descr",
4280	    "Verify PT_SETSTEP called twice");
4281}
4282
4283ATF_TC_BODY(setstep2, tc)
4284{
4285	ptrace_step(2, 1);
4286}
4287#endif
4288
4289#if defined(PT_STEP)
4290ATF_TC(setstep3);
4291ATF_TC_HEAD(setstep3, tc)
4292{
4293	atf_tc_set_md_var(tc, "descr",
4294	    "Verify PT_SETSTEP called three times");
4295}
4296
4297ATF_TC_BODY(setstep3, tc)
4298{
4299	ptrace_step(3, 1);
4300}
4301#endif
4302
4303#if defined(PT_STEP)
4304ATF_TC(setstep4);
4305ATF_TC_HEAD(setstep4, tc)
4306{
4307	atf_tc_set_md_var(tc, "descr",
4308	    "Verify PT_SETSTEP called four times");
4309}
4310
4311ATF_TC_BODY(setstep4, tc)
4312{
4313	ptrace_step(4, 1);
4314}
4315#endif
4316
4317ATF_TC(kill1);
4318ATF_TC_HEAD(kill1, tc)
4319{
4320	atf_tc_set_md_var(tc, "descr",
4321	    "Verify that PT_CONTINUE with SIGKILL terminates child");
4322}
4323
4324ATF_TC_BODY(kill1, tc)
4325{
4326	const int sigval = SIGSTOP, sigsent = SIGKILL;
4327	pid_t child, wpid;
4328#if defined(TWAIT_HAVE_STATUS)
4329	int status;
4330#endif
4331
4332	DPRINTF("Before forking process PID=%d\n", getpid());
4333	SYSCALL_REQUIRE((child = fork()) != -1);
4334	if (child == 0) {
4335		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
4336		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
4337
4338		DPRINTF("Before raising %s from child\n", strsignal(sigval));
4339		FORKEE_ASSERT(raise(sigval) == 0);
4340
4341		/* NOTREACHED */
4342		FORKEE_ASSERTX(0 &&
4343		    "Child should be terminated by a signal from its parent");
4344	}
4345	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
4346
4347	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4348	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
4349
4350	validate_status_stopped(status, sigval);
4351
4352	DPRINTF("Before resuming the child process where it left off and "
4353	    "without signal to be sent\n");
4354	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, sigsent) != -1);
4355
4356	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4357	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
4358
4359	validate_status_signaled(status, sigsent, 0);
4360
4361	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4362	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
4363}
4364
4365ATF_TC(kill2);
4366ATF_TC_HEAD(kill2, tc)
4367{
4368	atf_tc_set_md_var(tc, "descr",
4369	    "Verify that PT_KILL terminates child");
4370}
4371
4372ATF_TC_BODY(kill2, tc)
4373{
4374	const int sigval = SIGSTOP;
4375	pid_t child, wpid;
4376#if defined(TWAIT_HAVE_STATUS)
4377	int status;
4378#endif
4379
4380	DPRINTF("Before forking process PID=%d\n", getpid());
4381	SYSCALL_REQUIRE((child = fork()) != -1);
4382	if (child == 0) {
4383		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
4384		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
4385
4386		DPRINTF("Before raising %s from child\n", strsignal(sigval));
4387		FORKEE_ASSERT(raise(sigval) == 0);
4388
4389		/* NOTREACHED */
4390		FORKEE_ASSERTX(0 &&
4391		    "Child should be terminated by a signal from its parent");
4392	}
4393	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
4394
4395	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4396	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
4397
4398	validate_status_stopped(status, sigval);
4399
4400	DPRINTF("Before resuming the child process where it left off and "
4401	    "without signal to be sent\n");
4402	SYSCALL_REQUIRE(ptrace(PT_KILL, child, (void*)1, 0) != -1);
4403
4404	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4405	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
4406
4407	validate_status_signaled(status, SIGKILL, 0);
4408
4409	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4410	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
4411}
4412
4413ATF_TC(lwpinfo1);
4414ATF_TC_HEAD(lwpinfo1, tc)
4415{
4416	atf_tc_set_md_var(tc, "descr",
4417	    "Verify basic LWPINFO call for single thread (PT_TRACE_ME)");
4418}
4419
4420ATF_TC_BODY(lwpinfo1, tc)
4421{
4422	const int exitval = 5;
4423	const int sigval = SIGSTOP;
4424	pid_t child, wpid;
4425#if defined(TWAIT_HAVE_STATUS)
4426	int status;
4427#endif
4428	struct ptrace_lwpinfo info = {0, 0};
4429
4430	DPRINTF("Before forking process PID=%d\n", getpid());
4431	SYSCALL_REQUIRE((child = fork()) != -1);
4432	if (child == 0) {
4433		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
4434		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
4435
4436		DPRINTF("Before raising %s from child\n", strsignal(sigval));
4437		FORKEE_ASSERT(raise(sigval) == 0);
4438
4439		DPRINTF("Before exiting of the child process\n");
4440		_exit(exitval);
4441	}
4442	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
4443
4444	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4445	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
4446
4447	validate_status_stopped(status, sigval);
4448
4449	DPRINTF("Before calling ptrace(2) with PT_LWPINFO for child\n");
4450	SYSCALL_REQUIRE(ptrace(PT_LWPINFO, child, &info, sizeof(info)) != -1);
4451
4452	DPRINTF("Assert that there exists a thread\n");
4453	ATF_REQUIRE(info.pl_lwpid > 0);
4454
4455	DPRINTF("Assert that lwp thread %d received event PL_EVENT_SIGNAL\n",
4456	    info.pl_lwpid);
4457	ATF_REQUIRE_EQ_MSG(info.pl_event, PL_EVENT_SIGNAL,
4458	    "Received event %d != expected event %d",
4459	    info.pl_event, PL_EVENT_SIGNAL);
4460
4461	DPRINTF("Before calling ptrace(2) with PT_LWPINFO for child\n");
4462	SYSCALL_REQUIRE(ptrace(PT_LWPINFO, child, &info, sizeof(info)) != -1);
4463
4464	DPRINTF("Assert that there are no more lwp threads in child\n");
4465	ATF_REQUIRE_EQ(info.pl_lwpid, 0);
4466
4467	DPRINTF("Before resuming the child process where it left off and "
4468	    "without signal to be sent\n");
4469	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
4470
4471	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4472	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
4473
4474	validate_status_exited(status, exitval);
4475
4476	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4477	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
4478}
4479
4480#if defined(TWAIT_HAVE_PID)
4481ATF_TC(lwpinfo2);
4482ATF_TC_HEAD(lwpinfo2, tc)
4483{
4484	atf_tc_set_md_var(tc, "descr",
4485	    "Verify basic LWPINFO call for single thread (PT_ATTACH from "
4486	    "tracer)");
4487}
4488
4489ATF_TC_BODY(lwpinfo2, tc)
4490{
4491	struct msg_fds parent_tracee, parent_tracer;
4492	const int exitval_tracee = 5;
4493	const int exitval_tracer = 10;
4494	pid_t tracee, tracer, wpid;
4495	uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */
4496#if defined(TWAIT_HAVE_STATUS)
4497	int status;
4498#endif
4499	struct ptrace_lwpinfo info = {0, 0};
4500
4501	DPRINTF("Spawn tracee\n");
4502	SYSCALL_REQUIRE(msg_open(&parent_tracee) == 0);
4503	SYSCALL_REQUIRE(msg_open(&parent_tracer) == 0);
4504	tracee = atf_utils_fork();
4505	if (tracee == 0) {
4506
4507		/* Wait for message from the parent */
4508		CHILD_TO_PARENT("tracee ready", parent_tracee, msg);
4509		CHILD_FROM_PARENT("tracee exit", parent_tracee, msg);
4510
4511		_exit(exitval_tracee);
4512	}
4513	PARENT_FROM_CHILD("tracee ready", parent_tracee, msg);
4514
4515	DPRINTF("Spawn debugger\n");
4516	tracer = atf_utils_fork();
4517	if (tracer == 0) {
4518		/* No IPC to communicate with the child */
4519		DPRINTF("Before calling PT_ATTACH from tracee %d\n", getpid());
4520		FORKEE_ASSERT(ptrace(PT_ATTACH, tracee, NULL, 0) != -1);
4521
4522		/* Wait for tracee and assert that it was stopped w/ SIGSTOP */
4523		FORKEE_REQUIRE_SUCCESS(
4524		    wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
4525
4526		forkee_status_stopped(status, SIGSTOP);
4527
4528		DPRINTF("Before calling ptrace(2) with PT_LWPINFO for child\n");
4529		FORKEE_ASSERT(ptrace(PT_LWPINFO, tracee, &info, sizeof(info))
4530		    != -1);
4531
4532		DPRINTF("Assert that there exists a thread\n");
4533		FORKEE_ASSERTX(info.pl_lwpid > 0);
4534
4535		DPRINTF("Assert that lwp thread %d received event "
4536		    "PL_EVENT_SIGNAL\n", info.pl_lwpid);
4537		FORKEE_ASSERT_EQ(info.pl_event, PL_EVENT_SIGNAL);
4538
4539		DPRINTF("Before calling ptrace(2) with PT_LWPINFO for child\n");
4540		FORKEE_ASSERT(ptrace(PT_LWPINFO, tracee, &info, sizeof(info))
4541		    != -1);
4542
4543		DPRINTF("Assert that there are no more lwp threads in child\n");
4544		FORKEE_ASSERTX(info.pl_lwpid == 0);
4545
4546		/* Resume tracee with PT_CONTINUE */
4547		FORKEE_ASSERT(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1);
4548
4549		/* Inform parent that tracer has attached to tracee */
4550		CHILD_TO_PARENT("tracer ready", parent_tracer, msg);
4551		/* Wait for parent */
4552		CHILD_FROM_PARENT("tracer wait", parent_tracer, msg);
4553
4554		/* Wait for tracee and assert that it exited */
4555		FORKEE_REQUIRE_SUCCESS(
4556		    wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
4557
4558		forkee_status_exited(status, exitval_tracee);
4559
4560		DPRINTF("Before exiting of the tracer process\n");
4561		_exit(exitval_tracer);
4562	}
4563
4564	DPRINTF("Wait for the tracer to attach to the tracee\n");
4565	PARENT_FROM_CHILD("tracer ready", parent_tracer, msg);
4566
4567	DPRINTF("Resume the tracee and let it exit\n");
4568	PARENT_TO_CHILD("tracee exit", parent_tracee, msg);
4569
4570	DPRINTF("Detect that tracee is zombie\n");
4571	await_zombie(tracee);
4572
4573	DPRINTF("Assert that there is no status about tracee - "
4574	    "Tracer must detect zombie first - calling %s()\n", TWAIT_FNAME);
4575	TWAIT_REQUIRE_SUCCESS(
4576	    wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 0);
4577
4578	DPRINTF("Resume the tracer and let it detect exited tracee\n");
4579	PARENT_TO_CHILD("tracer wait", parent_tracer, msg);
4580
4581	DPRINTF("Wait for tracer to finish its job and exit - calling %s()\n",
4582	    TWAIT_FNAME);
4583	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracer, &status, 0),
4584	    tracer);
4585
4586	validate_status_exited(status, exitval_tracer);
4587
4588	DPRINTF("Wait for tracee to finish its job and exit - calling %s()\n",
4589	    TWAIT_FNAME);
4590	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracee, &status, WNOHANG),
4591	    tracee);
4592
4593	validate_status_exited(status, exitval_tracee);
4594
4595	msg_close(&parent_tracer);
4596	msg_close(&parent_tracee);
4597}
4598#endif
4599
4600ATF_TC(siginfo1);
4601ATF_TC_HEAD(siginfo1, tc)
4602{
4603	atf_tc_set_md_var(tc, "descr",
4604	    "Verify basic PT_GET_SIGINFO call for SIGTRAP from tracee");
4605}
4606
4607ATF_TC_BODY(siginfo1, tc)
4608{
4609	const int exitval = 5;
4610	const int sigval = SIGTRAP;
4611	pid_t child, wpid;
4612#if defined(TWAIT_HAVE_STATUS)
4613	int status;
4614#endif
4615	struct ptrace_siginfo info;
4616	memset(&info, 0, sizeof(info));
4617
4618	DPRINTF("Before forking process PID=%d\n", getpid());
4619	SYSCALL_REQUIRE((child = fork()) != -1);
4620	if (child == 0) {
4621		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
4622		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
4623
4624		DPRINTF("Before raising %s from child\n", strsignal(sigval));
4625		FORKEE_ASSERT(raise(sigval) == 0);
4626
4627		DPRINTF("Before exiting of the child process\n");
4628		_exit(exitval);
4629	}
4630	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
4631
4632	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4633	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
4634
4635	validate_status_stopped(status, sigval);
4636
4637	DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
4638	SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
4639
4640	DPRINTF("Signal traced to lwpid=%d\n", info.psi_lwpid);
4641	DPRINTF("Signal properties: si_signo=%#x si_code=%#x si_errno=%#x\n",
4642	    info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
4643	    info.psi_siginfo.si_errno);
4644
4645	DPRINTF("Before resuming the child process where it left off and "
4646	    "without signal to be sent\n");
4647	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
4648
4649	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4650	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
4651
4652	validate_status_exited(status, exitval);
4653
4654	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4655	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
4656}
4657
4658ATF_TC(siginfo2);
4659ATF_TC_HEAD(siginfo2, tc)
4660{
4661	atf_tc_set_md_var(tc, "descr",
4662	    "Verify basic PT_GET_SIGINFO and PT_SET_SIGINFO calls without "
4663	    "modification of SIGINT from tracee");
4664}
4665
4666static int siginfo2_caught = 0;
4667
4668static void
4669siginfo2_sighandler(int sig)
4670{
4671	FORKEE_ASSERT_EQ(sig, SIGINT);
4672
4673	++siginfo2_caught;
4674}
4675
4676ATF_TC_BODY(siginfo2, tc)
4677{
4678	const int exitval = 5;
4679	const int sigval = SIGINT;
4680	pid_t child, wpid;
4681	struct sigaction sa;
4682#if defined(TWAIT_HAVE_STATUS)
4683	int status;
4684#endif
4685	struct ptrace_siginfo info;
4686	memset(&info, 0, sizeof(info));
4687
4688	DPRINTF("Before forking process PID=%d\n", getpid());
4689	SYSCALL_REQUIRE((child = fork()) != -1);
4690	if (child == 0) {
4691		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
4692		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
4693
4694		sa.sa_handler = siginfo2_sighandler;
4695		sa.sa_flags = SA_SIGINFO;
4696		sigemptyset(&sa.sa_mask);
4697
4698		FORKEE_ASSERT(sigaction(sigval, &sa, NULL) != -1);
4699
4700		DPRINTF("Before raising %s from child\n", strsignal(sigval));
4701		FORKEE_ASSERT(raise(sigval) == 0);
4702
4703		FORKEE_ASSERT_EQ(siginfo2_caught, 1);
4704
4705		DPRINTF("Before exiting of the child process\n");
4706		_exit(exitval);
4707	}
4708	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
4709
4710	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4711	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
4712
4713	validate_status_stopped(status, sigval);
4714
4715	DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
4716	SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
4717
4718	DPRINTF("Signal traced to lwpid=%d\n", info.psi_lwpid);
4719	DPRINTF("Signal properties: si_signo=%#x si_code=%#x si_errno=%#x\n",
4720	    info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
4721	    info.psi_siginfo.si_errno);
4722
4723	DPRINTF("Before calling ptrace(2) with PT_SET_SIGINFO for child\n");
4724	SYSCALL_REQUIRE(ptrace(PT_SET_SIGINFO, child, &info, sizeof(info)) != -1);
4725
4726	DPRINTF("Before resuming the child process where it left off and "
4727	    "without signal to be sent\n");
4728	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, sigval) != -1);
4729
4730	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4731	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
4732
4733	validate_status_exited(status, exitval);
4734
4735	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4736	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
4737}
4738
4739ATF_TC(siginfo3);
4740ATF_TC_HEAD(siginfo3, tc)
4741{
4742	atf_tc_set_md_var(tc, "descr",
4743	    "Verify basic PT_GET_SIGINFO and PT_SET_SIGINFO calls with "
4744	    "setting signal to new value");
4745}
4746
4747static int siginfo3_caught = 0;
4748
4749static void
4750siginfo3_sigaction(int sig, siginfo_t *info, void *ctx)
4751{
4752	FORKEE_ASSERT_EQ(sig, SIGTRAP);
4753
4754	FORKEE_ASSERT_EQ(info->si_signo, SIGTRAP);
4755	FORKEE_ASSERT_EQ(info->si_code, TRAP_BRKPT);
4756
4757	++siginfo3_caught;
4758}
4759
4760ATF_TC_BODY(siginfo3, tc)
4761{
4762	const int exitval = 5;
4763	const int sigval = SIGINT;
4764	const int sigfaked = SIGTRAP;
4765	const int sicodefaked = TRAP_BRKPT;
4766	pid_t child, wpid;
4767	struct sigaction sa;
4768#if defined(TWAIT_HAVE_STATUS)
4769	int status;
4770#endif
4771	struct ptrace_siginfo info;
4772	memset(&info, 0, sizeof(info));
4773
4774	DPRINTF("Before forking process PID=%d\n", getpid());
4775	SYSCALL_REQUIRE((child = fork()) != -1);
4776	if (child == 0) {
4777		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
4778		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
4779
4780		sa.sa_sigaction = siginfo3_sigaction;
4781		sa.sa_flags = SA_SIGINFO;
4782		sigemptyset(&sa.sa_mask);
4783
4784		FORKEE_ASSERT(sigaction(sigfaked, &sa, NULL) != -1);
4785
4786		DPRINTF("Before raising %s from child\n", strsignal(sigval));
4787		FORKEE_ASSERT(raise(sigval) == 0);
4788
4789		FORKEE_ASSERT_EQ(siginfo3_caught, 1);
4790
4791		DPRINTF("Before exiting of the child process\n");
4792		_exit(exitval);
4793	}
4794	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
4795
4796	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4797	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
4798
4799	validate_status_stopped(status, sigval);
4800
4801	DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
4802	SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
4803
4804	DPRINTF("Signal traced to lwpid=%d\n", info.psi_lwpid);
4805	DPRINTF("Signal properties: si_signo=%#x si_code=%#x si_errno=%#x\n",
4806	    info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
4807	    info.psi_siginfo.si_errno);
4808
4809	DPRINTF("Before setting new faked signal to signo=%d si_code=%d\n",
4810	    sigfaked, sicodefaked);
4811	info.psi_siginfo.si_signo = sigfaked;
4812	info.psi_siginfo.si_code = sicodefaked;
4813
4814	DPRINTF("Before calling ptrace(2) with PT_SET_SIGINFO for child\n");
4815	SYSCALL_REQUIRE(ptrace(PT_SET_SIGINFO, child, &info, sizeof(info)) != -1);
4816
4817	DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
4818	SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
4819
4820	DPRINTF("Before checking siginfo_t\n");
4821	ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sigfaked);
4822	ATF_REQUIRE_EQ(info.psi_siginfo.si_code, sicodefaked);
4823
4824	DPRINTF("Before resuming the child process where it left off and "
4825	    "without signal to be sent\n");
4826	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, sigfaked) != -1);
4827
4828	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4829	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
4830
4831	validate_status_exited(status, exitval);
4832
4833	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4834	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
4835}
4836
4837ATF_TC(siginfo4);
4838ATF_TC_HEAD(siginfo4, tc)
4839{
4840	atf_tc_set_md_var(tc, "descr",
4841	    "Detect SIGTRAP TRAP_EXEC from tracee");
4842}
4843
4844ATF_TC_BODY(siginfo4, tc)
4845{
4846	const int sigval = SIGTRAP;
4847	pid_t child, wpid;
4848#if defined(TWAIT_HAVE_STATUS)
4849	int status;
4850#endif
4851
4852	struct ptrace_siginfo info;
4853	memset(&info, 0, sizeof(info));
4854
4855	DPRINTF("Before forking process PID=%d\n", getpid());
4856	SYSCALL_REQUIRE((child = fork()) != -1);
4857	if (child == 0) {
4858		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
4859		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
4860
4861		DPRINTF("Before calling execve(2) from child\n");
4862		execlp("/bin/echo", "/bin/echo", NULL);
4863
4864		FORKEE_ASSERT(0 && "Not reached");
4865	}
4866	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
4867
4868	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4869	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
4870
4871	validate_status_stopped(status, sigval);
4872
4873	DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
4874	SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
4875
4876	DPRINTF("Signal traced to lwpid=%d\n", info.psi_lwpid);
4877	DPRINTF("Signal properties: si_signo=%#x si_code=%#x si_errno=%#x\n",
4878	    info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
4879	    info.psi_siginfo.si_errno);
4880
4881	ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sigval);
4882	ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_EXEC);
4883
4884	DPRINTF("Before resuming the child process where it left off and "
4885	    "without signal to be sent\n");
4886	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
4887
4888	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4889	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
4890
4891	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4892	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
4893}
4894
4895#if defined(TWAIT_HAVE_PID)
4896ATF_TC(siginfo5);
4897ATF_TC_HEAD(siginfo5, tc)
4898{
4899	atf_tc_set_md_var(tc, "descr",
4900	    "Verify that fork(2) is intercepted by ptrace(2) with EVENT_MASK "
4901	    "set to PTRACE_FORK and reports correct signal information");
4902}
4903
4904ATF_TC_BODY(siginfo5, tc)
4905{
4906	const int exitval = 5;
4907	const int exitval2 = 15;
4908	const int sigval = SIGSTOP;
4909	pid_t child, child2, wpid;
4910#if defined(TWAIT_HAVE_STATUS)
4911	int status;
4912#endif
4913	ptrace_state_t state;
4914	const int slen = sizeof(state);
4915	ptrace_event_t event;
4916	const int elen = sizeof(event);
4917	struct ptrace_siginfo info;
4918
4919	memset(&info, 0, sizeof(info));
4920
4921	DPRINTF("Before forking process PID=%d\n", getpid());
4922	SYSCALL_REQUIRE((child = fork()) != -1);
4923	if (child == 0) {
4924		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
4925		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
4926
4927		DPRINTF("Before raising %s from child\n", strsignal(sigval));
4928		FORKEE_ASSERT(raise(sigval) == 0);
4929
4930		FORKEE_ASSERT((child2 = fork()) != -1);
4931
4932		if (child2 == 0)
4933			_exit(exitval2);
4934
4935		FORKEE_REQUIRE_SUCCESS
4936		    (wpid = TWAIT_GENERIC(child2, &status, 0), child2);
4937
4938		forkee_status_exited(status, exitval2);
4939
4940		DPRINTF("Before exiting of the child process\n");
4941		_exit(exitval);
4942	}
4943	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
4944
4945	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
4946	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
4947
4948	validate_status_stopped(status, sigval);
4949
4950	DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
4951	SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
4952
4953	DPRINTF("Before checking siginfo_t\n");
4954	ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sigval);
4955	ATF_REQUIRE_EQ(info.psi_siginfo.si_code, SI_LWP);
4956
4957	DPRINTF("Enable PTRACE_FORK in EVENT_MASK for the child %d\n", child);
4958	event.pe_set_event = PTRACE_FORK;
4959	SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1);
4960
4961	DPRINTF("Before resuming the child process where it left off and "
4962	    "without signal to be sent\n");
4963        DPRINTF("We expect two SIGTRAP events, for child %d (TRAP_CHLD, "
4964               "pe_report_event=PTRACE_FORK, state.pe_other_pid=child2) and "
4965               "for child2 (TRAP_CHLD, pe_report_event=PTRACE_FORK, "
4966                "state.pe_other_pid=child)\n", child);
4967	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
4968
4969	DPRINTF("Before calling %s() for the child %d\n", TWAIT_FNAME, child);
4970	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
4971
4972	validate_status_stopped(status, SIGTRAP);
4973
4974	DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
4975	SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
4976
4977	DPRINTF("Before checking siginfo_t\n");
4978	ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, SIGTRAP);
4979	ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_CHLD);
4980
4981	SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1);
4982	ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_FORK);
4983
4984	child2 = state.pe_other_pid;
4985	DPRINTF("Reported PTRACE_FORK event with forkee %d\n", child2);
4986
4987	DPRINTF("Before calling %s() for the forkee %d of the child %d\n",
4988	    TWAIT_FNAME, child2, child);
4989	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child2, &status, 0),
4990	    child2);
4991
4992	validate_status_stopped(status, SIGTRAP);
4993
4994	DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
4995	SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
4996
4997	DPRINTF("Before checking siginfo_t\n");
4998	ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, SIGTRAP);
4999	ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_CHLD);
5000
5001	SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child2, &state, slen) != -1);
5002	ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_FORK);
5003	ATF_REQUIRE_EQ(state.pe_other_pid, child);
5004
5005	DPRINTF("Before resuming the forkee process where it left off and "
5006	    "without signal to be sent\n");
5007	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child2, (void *)1, 0) != -1);
5008
5009	DPRINTF("Before resuming the child process where it left off and "
5010	    "without signal to be sent\n");
5011	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
5012
5013	DPRINTF("Before calling %s() for the forkee - expected exited\n",
5014	    TWAIT_FNAME);
5015	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child2, &status, 0),
5016	    child2);
5017
5018	validate_status_exited(status, exitval2);
5019
5020	DPRINTF("Before calling %s() for the forkee - expected no process\n",
5021	    TWAIT_FNAME);
5022	TWAIT_REQUIRE_FAILURE(ECHILD,
5023	    wpid = TWAIT_GENERIC(child2, &status, 0));
5024
5025	DPRINTF("Before calling %s() for the child - expected stopped "
5026	    "SIGCHLD\n", TWAIT_FNAME);
5027	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5028
5029	validate_status_stopped(status, SIGCHLD);
5030
5031	DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
5032	SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
5033
5034	DPRINTF("Before checking siginfo_t\n");
5035	ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, SIGCHLD);
5036	ATF_REQUIRE_EQ(info.psi_siginfo.si_code, CLD_EXITED);
5037
5038	DPRINTF("Before resuming the child process where it left off and "
5039	    "without signal to be sent\n");
5040	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
5041
5042	DPRINTF("Before calling %s() for the child - expected exited\n",
5043	    TWAIT_FNAME);
5044	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5045
5046	validate_status_exited(status, exitval);
5047
5048	DPRINTF("Before calling %s() for the child - expected no process\n",
5049	    TWAIT_FNAME);
5050	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
5051}
5052#endif
5053
5054#if defined(PT_STEP)
5055ATF_TC(siginfo6);
5056ATF_TC_HEAD(siginfo6, tc)
5057{
5058	atf_tc_set_md_var(tc, "descr",
5059	    "Verify single PT_STEP call with signal information check");
5060}
5061
5062ATF_TC_BODY(siginfo6, tc)
5063{
5064	const int exitval = 5;
5065	const int sigval = SIGSTOP;
5066	pid_t child, wpid;
5067#if defined(TWAIT_HAVE_STATUS)
5068	int status;
5069#endif
5070	int happy;
5071	struct ptrace_siginfo info;
5072
5073#if defined(__arm__)
5074	/* PT_STEP not supported on arm 32-bit */
5075	atf_tc_expect_fail("PR kern/52119");
5076#endif
5077
5078	memset(&info, 0, sizeof(info));
5079
5080	DPRINTF("Before forking process PID=%d\n", getpid());
5081	SYSCALL_REQUIRE((child = fork()) != -1);
5082	if (child == 0) {
5083		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
5084		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
5085
5086		happy = check_happy(100);
5087
5088		DPRINTF("Before raising %s from child\n", strsignal(sigval));
5089		FORKEE_ASSERT(raise(sigval) == 0);
5090
5091		FORKEE_ASSERT_EQ(happy, check_happy(100));
5092
5093		DPRINTF("Before exiting of the child process\n");
5094		_exit(exitval);
5095	}
5096	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
5097
5098	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5099	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5100
5101	validate_status_stopped(status, sigval);
5102
5103	DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
5104	SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
5105
5106	DPRINTF("Before checking siginfo_t\n");
5107	ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sigval);
5108	ATF_REQUIRE_EQ(info.psi_siginfo.si_code, SI_LWP);
5109
5110	DPRINTF("Before resuming the child process where it left off and "
5111	    "without signal to be sent (use PT_STEP)\n");
5112	SYSCALL_REQUIRE(ptrace(PT_STEP, child, (void *)1, 0) != -1);
5113
5114	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5115	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5116
5117	validate_status_stopped(status, SIGTRAP);
5118
5119	DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
5120	SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
5121
5122	DPRINTF("Before checking siginfo_t\n");
5123	ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, SIGTRAP);
5124	ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_TRACE);
5125
5126	DPRINTF("Before resuming the child process where it left off and "
5127	    "without signal to be sent\n");
5128	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
5129
5130	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5131	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5132
5133	validate_status_exited(status, exitval);
5134
5135	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5136	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
5137}
5138#endif
5139
5140volatile lwpid_t the_lwp_id = 0;
5141
5142static void
5143lwp_main_func(void *arg)
5144{
5145	the_lwp_id = _lwp_self();
5146	_lwp_exit();
5147}
5148
5149ATF_TC(lwp_create1);
5150ATF_TC_HEAD(lwp_create1, tc)
5151{
5152	atf_tc_set_md_var(tc, "descr",
5153	    "Verify that 1 LWP creation is intercepted by ptrace(2) with "
5154	    "EVENT_MASK set to PTRACE_LWP_CREATE");
5155}
5156
5157ATF_TC_BODY(lwp_create1, tc)
5158{
5159	const int exitval = 5;
5160	const int sigval = SIGSTOP;
5161	pid_t child, wpid;
5162#if defined(TWAIT_HAVE_STATUS)
5163	int status;
5164#endif
5165	ptrace_state_t state;
5166	const int slen = sizeof(state);
5167	ptrace_event_t event;
5168	const int elen = sizeof(event);
5169	ucontext_t uc;
5170	lwpid_t lid;
5171	static const size_t ssize = 16*1024;
5172	void *stack;
5173
5174	DPRINTF("Before forking process PID=%d\n", getpid());
5175	SYSCALL_REQUIRE((child = fork()) != -1);
5176	if (child == 0) {
5177		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
5178		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
5179
5180		DPRINTF("Before raising %s from child\n", strsignal(sigval));
5181		FORKEE_ASSERT(raise(sigval) == 0);
5182
5183		DPRINTF("Before allocating memory for stack in child\n");
5184		FORKEE_ASSERT((stack = malloc(ssize)) != NULL);
5185
5186		DPRINTF("Before making context for new lwp in child\n");
5187		_lwp_makecontext(&uc, lwp_main_func, NULL, NULL, stack, ssize);
5188
5189		DPRINTF("Before creating new in child\n");
5190		FORKEE_ASSERT(_lwp_create(&uc, 0, &lid) == 0);
5191
5192		DPRINTF("Before waiting for lwp %d to exit\n", lid);
5193		FORKEE_ASSERT(_lwp_wait(lid, NULL) == 0);
5194
5195		DPRINTF("Before verifying that reported %d and running lid %d "
5196		    "are the same\n", lid, the_lwp_id);
5197		FORKEE_ASSERT_EQ(lid, the_lwp_id);
5198
5199		DPRINTF("Before exiting of the child process\n");
5200		_exit(exitval);
5201	}
5202	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
5203
5204	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5205	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5206
5207	validate_status_stopped(status, sigval);
5208
5209	DPRINTF("Set empty EVENT_MASK for the child %d\n", child);
5210	event.pe_set_event = PTRACE_LWP_CREATE;
5211	SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1);
5212
5213	DPRINTF("Before resuming the child process where it left off and "
5214	    "without signal to be sent\n");
5215	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
5216
5217	DPRINTF("Before calling %s() for the child - expected stopped "
5218	    "SIGTRAP\n", TWAIT_FNAME);
5219	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5220
5221	validate_status_stopped(status, SIGTRAP);
5222
5223	SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1);
5224
5225	ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_LWP_CREATE);
5226
5227	lid = state.pe_lwp;
5228	DPRINTF("Reported PTRACE_LWP_CREATE event with lid %d\n", lid);
5229
5230	DPRINTF("Before resuming the child process where it left off and "
5231	    "without signal to be sent\n");
5232	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
5233
5234	DPRINTF("Before calling %s() for the child - expected exited\n",
5235	    TWAIT_FNAME);
5236	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5237
5238	validate_status_exited(status, exitval);
5239
5240	DPRINTF("Before calling %s() for the child - expected no process\n",
5241	    TWAIT_FNAME);
5242	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
5243}
5244
5245ATF_TC(lwp_exit1);
5246ATF_TC_HEAD(lwp_exit1, tc)
5247{
5248	atf_tc_set_md_var(tc, "descr",
5249	    "Verify that 1 LWP creation is intercepted by ptrace(2) with "
5250	    "EVENT_MASK set to PTRACE_LWP_EXIT");
5251}
5252
5253ATF_TC_BODY(lwp_exit1, tc)
5254{
5255	const int exitval = 5;
5256	const int sigval = SIGSTOP;
5257	pid_t child, wpid;
5258#if defined(TWAIT_HAVE_STATUS)
5259	int status;
5260#endif
5261	ptrace_state_t state;
5262	const int slen = sizeof(state);
5263	ptrace_event_t event;
5264	const int elen = sizeof(event);
5265	ucontext_t uc;
5266	lwpid_t lid;
5267	static const size_t ssize = 16*1024;
5268	void *stack;
5269
5270	DPRINTF("Before forking process PID=%d\n", getpid());
5271	SYSCALL_REQUIRE((child = fork()) != -1);
5272	if (child == 0) {
5273		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
5274		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
5275
5276		DPRINTF("Before raising %s from child\n", strsignal(sigval));
5277		FORKEE_ASSERT(raise(sigval) == 0);
5278
5279		DPRINTF("Before allocating memory for stack in child\n");
5280		FORKEE_ASSERT((stack = malloc(ssize)) != NULL);
5281
5282		DPRINTF("Before making context for new lwp in child\n");
5283		_lwp_makecontext(&uc, lwp_main_func, NULL, NULL, stack, ssize);
5284
5285		DPRINTF("Before creating new in child\n");
5286		FORKEE_ASSERT(_lwp_create(&uc, 0, &lid) == 0);
5287
5288		DPRINTF("Before waiting for lwp %d to exit\n", lid);
5289		FORKEE_ASSERT(_lwp_wait(lid, NULL) == 0);
5290
5291		DPRINTF("Before verifying that reported %d and running lid %d "
5292		    "are the same\n", lid, the_lwp_id);
5293		FORKEE_ASSERT_EQ(lid, the_lwp_id);
5294
5295		DPRINTF("Before exiting of the child process\n");
5296		_exit(exitval);
5297	}
5298	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
5299
5300	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5301	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5302
5303	validate_status_stopped(status, sigval);
5304
5305	DPRINTF("Set empty EVENT_MASK for the child %d\n", child);
5306	event.pe_set_event = PTRACE_LWP_EXIT;
5307	SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1);
5308
5309	DPRINTF("Before resuming the child process where it left off and "
5310	    "without signal to be sent\n");
5311	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
5312
5313	DPRINTF("Before calling %s() for the child - expected stopped "
5314	    "SIGTRAP\n", TWAIT_FNAME);
5315	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5316
5317	validate_status_stopped(status, SIGTRAP);
5318
5319	SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1);
5320
5321	ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_LWP_EXIT);
5322
5323	lid = state.pe_lwp;
5324	DPRINTF("Reported PTRACE_LWP_EXIT event with lid %d\n", lid);
5325
5326	DPRINTF("Before resuming the child process where it left off and "
5327	    "without signal to be sent\n");
5328	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
5329
5330	DPRINTF("Before calling %s() for the child - expected exited\n",
5331	    TWAIT_FNAME);
5332	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5333
5334	validate_status_exited(status, exitval);
5335
5336	DPRINTF("Before calling %s() for the child - expected no process\n",
5337	    TWAIT_FNAME);
5338	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
5339}
5340
5341ATF_TC(signal1);
5342ATF_TC_HEAD(signal1, tc)
5343{
5344	atf_tc_set_md_var(tc, "descr",
5345	    "Verify that masking single unrelated signal does not stop tracer "
5346	    "from catching other signals");
5347}
5348
5349ATF_TC_BODY(signal1, tc)
5350{
5351	const int exitval = 5;
5352	const int sigval = SIGSTOP;
5353	const int sigmasked = SIGTRAP;
5354	const int signotmasked = SIGINT;
5355	pid_t child, wpid;
5356#if defined(TWAIT_HAVE_STATUS)
5357	int status;
5358#endif
5359	sigset_t intmask;
5360
5361	DPRINTF("Before forking process PID=%d\n", getpid());
5362	SYSCALL_REQUIRE((child = fork()) != -1);
5363	if (child == 0) {
5364		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
5365		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
5366
5367		sigemptyset(&intmask);
5368		sigaddset(&intmask, sigmasked);
5369		sigprocmask(SIG_BLOCK, &intmask, NULL);
5370
5371		DPRINTF("Before raising %s from child\n", strsignal(sigval));
5372		FORKEE_ASSERT(raise(sigval) == 0);
5373
5374		DPRINTF("Before raising %s from child\n",
5375		    strsignal(signotmasked));
5376		FORKEE_ASSERT(raise(signotmasked) == 0);
5377
5378		DPRINTF("Before exiting of the child process\n");
5379		_exit(exitval);
5380	}
5381	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
5382
5383	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5384	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5385
5386	validate_status_stopped(status, sigval);
5387
5388	DPRINTF("Before resuming the child process where it left off and "
5389	    "without signal to be sent\n");
5390	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
5391
5392	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5393	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5394
5395	validate_status_stopped(status, signotmasked);
5396
5397	DPRINTF("Before resuming the child process where it left off and "
5398	    "without signal to be sent\n");
5399	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
5400
5401	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5402	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5403
5404	validate_status_exited(status, exitval);
5405
5406	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5407	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
5408}
5409
5410ATF_TC(signal2);
5411ATF_TC_HEAD(signal2, tc)
5412{
5413	atf_tc_set_md_var(tc, "descr",
5414	    "Verify that masking SIGTRAP in tracee stops tracer from "
5415	    "catching this raised signal");
5416}
5417
5418ATF_TC_BODY(signal2, tc)
5419{
5420	const int exitval = 5;
5421	const int sigval = SIGSTOP;
5422	const int sigmasked = SIGTRAP;
5423	pid_t child, wpid;
5424#if defined(TWAIT_HAVE_STATUS)
5425	int status;
5426#endif
5427	sigset_t intmask;
5428
5429	DPRINTF("Before forking process PID=%d\n", getpid());
5430	SYSCALL_REQUIRE((child = fork()) != -1);
5431	if (child == 0) {
5432		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
5433		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
5434
5435		sigemptyset(&intmask);
5436		sigaddset(&intmask, sigmasked);
5437		sigprocmask(SIG_BLOCK, &intmask, NULL);
5438
5439		DPRINTF("Before raising %s from child\n", strsignal(sigval));
5440		FORKEE_ASSERT(raise(sigval) == 0);
5441
5442		DPRINTF("Before raising %s breakpoint from child\n",
5443		    strsignal(sigmasked));
5444		FORKEE_ASSERT(raise(sigmasked) == 0);
5445
5446		DPRINTF("Before exiting of the child process\n");
5447		_exit(exitval);
5448	}
5449	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
5450
5451	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5452	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5453
5454	validate_status_stopped(status, sigval);
5455
5456	DPRINTF("Before resuming the child process where it left off and "
5457	    "without signal to be sent\n");
5458	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
5459
5460	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5461	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5462
5463	validate_status_exited(status, exitval);
5464
5465	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5466	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
5467}
5468
5469ATF_TC(signal3);
5470ATF_TC_HEAD(signal3, tc)
5471{
5472	atf_tc_set_md_var(tc, "timeout", "5");
5473	atf_tc_set_md_var(tc, "descr",
5474	    "Verify that masking SIGTRAP in tracee does not stop tracer from "
5475	    "catching software breakpoints");
5476}
5477
5478ATF_TC_BODY(signal3, tc)
5479{
5480	const int exitval = 5;
5481	const int sigval = SIGSTOP;
5482	const int sigmasked = SIGTRAP;
5483	pid_t child, wpid;
5484#if defined(TWAIT_HAVE_STATUS)
5485	int status;
5486#endif
5487	sigset_t intmask;
5488
5489	atf_tc_expect_fail("PR kern/51918");
5490
5491	// This test breaks now on some ports, temporarily disable it
5492	ATF_REQUIRE(0 && "In order to get reliable failure, abort");
5493
5494#if defined(__sparc__)
5495	atf_tc_expect_timeout("PR kern/52167");
5496
5497	// timeout wins, failure still valid
5498	// atf_tc_expect_fail("PR kern/51918");
5499#endif
5500
5501	DPRINTF("Before forking process PID=%d\n", getpid());
5502	SYSCALL_REQUIRE((child = fork()) != -1);
5503	if (child == 0) {
5504		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
5505		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
5506
5507		sigemptyset(&intmask);
5508		sigaddset(&intmask, sigmasked);
5509		sigprocmask(SIG_BLOCK, &intmask, NULL);
5510
5511		DPRINTF("Before raising %s from child\n", strsignal(sigval));
5512		FORKEE_ASSERT(raise(sigval) == 0);
5513
5514		DPRINTF("Before raising software breakpoint from child\n");
5515
5516#ifdef PTRACE_BREAKPOINT_ASM
5517		PTRACE_BREAKPOINT_ASM;
5518#else
5519		/* port me */
5520#endif
5521
5522		DPRINTF("Before exiting of the child process\n");
5523		_exit(exitval);
5524	}
5525	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
5526
5527	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5528	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5529
5530	validate_status_stopped(status, sigval);
5531
5532	DPRINTF("Before resuming the child process where it left off and "
5533	    "without signal to be sent\n");
5534	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
5535
5536	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5537	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5538
5539	validate_status_stopped(status, sigmasked);
5540
5541	DPRINTF("Before resuming the child process where it left off and "
5542	    "without signal to be sent\n");
5543	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
5544
5545	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5546	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5547
5548	validate_status_exited(status, exitval);
5549
5550	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5551	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
5552}
5553
5554#if defined(PT_STEP)
5555ATF_TC(signal4);
5556ATF_TC_HEAD(signal4, tc)
5557{
5558	atf_tc_set_md_var(tc, "descr",
5559	    "Verify that masking SIGTRAP in tracee does not stop tracer from "
5560	    "catching single step trap");
5561}
5562
5563ATF_TC_BODY(signal4, tc)
5564{
5565	const int exitval = 5;
5566	const int sigval = SIGSTOP;
5567	const int sigmasked = SIGTRAP;
5568	pid_t child, wpid;
5569#if defined(TWAIT_HAVE_STATUS)
5570	int status;
5571#endif
5572	sigset_t intmask;
5573	int happy;
5574
5575#if defined(__arm__)
5576	/* PT_STEP not supported on arm 32-bit */
5577	atf_tc_expect_fail("PR kern/51918 PR kern/52119");
5578#endif
5579
5580	DPRINTF("Before forking process PID=%d\n", getpid());
5581	SYSCALL_REQUIRE((child = fork()) != -1);
5582	if (child == 0) {
5583		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
5584		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
5585
5586		happy = check_happy(100);
5587
5588		sigemptyset(&intmask);
5589		sigaddset(&intmask, sigmasked);
5590		sigprocmask(SIG_BLOCK, &intmask, NULL);
5591
5592		DPRINTF("Before raising %s from child\n", strsignal(sigval));
5593		FORKEE_ASSERT(raise(sigval) == 0);
5594
5595		FORKEE_ASSERT_EQ(happy, check_happy(100));
5596
5597		DPRINTF("Before exiting of the child process\n");
5598		_exit(exitval);
5599	}
5600	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
5601
5602	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5603	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5604
5605	validate_status_stopped(status, sigval);
5606
5607	DPRINTF("Before resuming the child process where it left off and "
5608	    "without signal to be sent\n");
5609	SYSCALL_REQUIRE(ptrace(PT_STEP, child, (void *)1, 0) != -1);
5610
5611	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5612	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5613
5614	validate_status_stopped(status, sigmasked);
5615
5616	DPRINTF("Before resuming the child process where it left off and "
5617	    "without signal to be sent\n");
5618	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
5619
5620	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5621	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5622
5623	validate_status_exited(status, exitval);
5624
5625	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5626	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
5627}
5628#endif
5629
5630ATF_TC(signal5);
5631ATF_TC_HEAD(signal5, tc)
5632{
5633	atf_tc_set_md_var(tc, "descr",
5634	    "Verify that masking SIGTRAP in tracee does not stop tracer from "
5635	    "catching exec() breakpoint");
5636}
5637
5638ATF_TC_BODY(signal5, tc)
5639{
5640	const int exitval = 5;
5641	const int sigval = SIGSTOP;
5642	const int sigmasked = SIGTRAP;
5643	pid_t child, wpid;
5644#if defined(TWAIT_HAVE_STATUS)
5645	int status;
5646#endif
5647	sigset_t intmask;
5648
5649	atf_tc_expect_fail("wrong signal");
5650
5651	DPRINTF("Before forking process PID=%d\n", getpid());
5652	SYSCALL_REQUIRE((child = fork()) != -1);
5653	if (child == 0) {
5654		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
5655		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
5656
5657		sigemptyset(&intmask);
5658		sigaddset(&intmask, sigmasked);
5659		sigprocmask(SIG_BLOCK, &intmask, NULL);
5660
5661		DPRINTF("Before raising %s from child\n", strsignal(sigval));
5662		FORKEE_ASSERT(raise(sigval) == 0);
5663
5664		DPRINTF("Before calling execve(2) from child\n");
5665		execlp("/bin/echo", "/bin/echo", NULL);
5666
5667		DPRINTF("Before exiting of the child process\n");
5668		_exit(exitval);
5669	}
5670	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
5671
5672	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5673	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5674
5675	validate_status_stopped(status, sigval);
5676
5677	DPRINTF("Before resuming the child process where it left off and "
5678	    "without signal to be sent\n");
5679	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
5680
5681	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5682	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5683
5684	validate_status_stopped(status, sigmasked);
5685
5686	DPRINTF("Before resuming the child process where it left off and "
5687	    "without signal to be sent\n");
5688	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
5689
5690	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5691	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5692
5693	validate_status_exited(status, exitval);
5694
5695	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5696	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
5697}
5698
5699#if defined(TWAIT_HAVE_PID)
5700ATF_TC(signal6);
5701ATF_TC_HEAD(signal6, tc)
5702{
5703	atf_tc_set_md_var(tc, "timeout", "5");
5704	atf_tc_set_md_var(tc, "descr",
5705	    "Verify that masking SIGTRAP in tracee does not stop tracer from "
5706	    "catching PTRACE_FORK breakpoint");
5707}
5708
5709ATF_TC_BODY(signal6, tc)
5710{
5711	const int exitval = 5;
5712	const int exitval2 = 15;
5713	const int sigval = SIGSTOP;
5714	const int sigmasked = SIGTRAP;
5715	pid_t child, child2, wpid;
5716#if defined(TWAIT_HAVE_STATUS)
5717	int status;
5718#endif
5719	sigset_t intmask;
5720	ptrace_state_t state;
5721	const int slen = sizeof(state);
5722	ptrace_event_t event;
5723	const int elen = sizeof(event);
5724
5725	atf_tc_expect_timeout("PR kern/51918");
5726
5727	DPRINTF("Before forking process PID=%d\n", getpid());
5728	SYSCALL_REQUIRE((child = fork()) != -1);
5729	if (child == 0) {
5730		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
5731		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
5732
5733		sigemptyset(&intmask);
5734		sigaddset(&intmask, sigmasked);
5735		sigprocmask(SIG_BLOCK, &intmask, NULL);
5736
5737		DPRINTF("Before raising %s from child\n", strsignal(sigval));
5738		FORKEE_ASSERT(raise(sigval) == 0);
5739
5740		FORKEE_ASSERT((child2 = fork()) != -1);
5741
5742		if (child2 == 0)
5743			_exit(exitval2);
5744
5745		FORKEE_REQUIRE_SUCCESS
5746			(wpid = TWAIT_GENERIC(child2, &status, 0), child2);
5747
5748		forkee_status_exited(status, exitval2);
5749
5750		DPRINTF("Before exiting of the child process\n");
5751		_exit(exitval);
5752	}
5753	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
5754
5755	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5756	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5757
5758	validate_status_stopped(status, sigval);
5759
5760	DPRINTF("Enable PTRACE_FORK in EVENT_MASK for the child %d\n", child);
5761	event.pe_set_event = PTRACE_FORK;
5762	SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1);
5763
5764	DPRINTF("Before resuming the child process where it left off and "
5765	    "without signal to be sent\n");
5766	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
5767
5768	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5769	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5770
5771	validate_status_stopped(status, sigmasked);
5772
5773	SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1);
5774	ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_FORK);
5775
5776	child2 = state.pe_other_pid;
5777	DPRINTF("Reported PTRACE_FORK event with forkee %d\n", child2);
5778
5779	DPRINTF("Before calling %s() for the child2\n", TWAIT_FNAME);
5780	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child2, &status, 0),
5781	    child2);
5782
5783	validate_status_stopped(status, SIGTRAP);
5784
5785	SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child2, &state, slen) != -1);
5786	ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_FORK);
5787	ATF_REQUIRE_EQ(state.pe_other_pid, child);
5788
5789	DPRINTF("Before resuming the forkee process where it left off and "
5790	    "without signal to be sent\n");
5791	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child2, (void *)1, 0) != -1);
5792
5793	DPRINTF("Before resuming the child process where it left off and "
5794	    "without signal to be sent\n");
5795	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
5796
5797	DPRINTF("Before calling %s() for the forkee - expected exited\n",
5798	    TWAIT_FNAME);
5799	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child2, &status, 0),
5800	    child2);
5801
5802	validate_status_exited(status, exitval2);
5803
5804	DPRINTF("Before calling %s() for the forkee - expected no process\n",
5805	    TWAIT_FNAME);
5806	TWAIT_REQUIRE_FAILURE(ECHILD,
5807	    wpid = TWAIT_GENERIC(child2, &status, 0));
5808
5809	DPRINTF("Before calling %s() for the child - expected stopped "
5810	    "SIGCHLD\n", TWAIT_FNAME);
5811	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5812
5813	validate_status_stopped(status, SIGCHLD);
5814
5815	DPRINTF("Before resuming the child process where it left off and "
5816	    "without signal to be sent\n");
5817	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
5818
5819	DPRINTF("Before calling %s() for the child - expected exited\n",
5820	    TWAIT_FNAME);
5821	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5822
5823	validate_status_exited(status, exitval);
5824
5825	DPRINTF("Before calling %s() for the child - expected no process\n",
5826	    TWAIT_FNAME);
5827	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
5828}
5829#endif
5830
5831#if defined(TWAIT_HAVE_PID)
5832ATF_TC(signal7);
5833ATF_TC_HEAD(signal7, tc)
5834{
5835	atf_tc_set_md_var(tc, "descr",
5836	    "Verify that masking SIGTRAP in tracee does not stop tracer from "
5837	    "catching PTRACE_VFORK breakpoint");
5838}
5839
5840ATF_TC_BODY(signal7, tc)
5841{
5842	const int exitval = 5;
5843	const int exitval2 = 15;
5844	const int sigval = SIGSTOP;
5845	const int sigmasked = SIGTRAP;
5846	pid_t child, child2, wpid;
5847#if defined(TWAIT_HAVE_STATUS)
5848	int status;
5849#endif
5850	sigset_t intmask;
5851	ptrace_state_t state;
5852	const int slen = sizeof(state);
5853	ptrace_event_t event;
5854	const int elen = sizeof(event);
5855
5856	atf_tc_expect_fail("PR kern/51918 PR kern/51630");
5857
5858	DPRINTF("Before forking process PID=%d\n", getpid());
5859	SYSCALL_REQUIRE((child = fork()) != -1);
5860	if (child == 0) {
5861		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
5862		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
5863
5864		sigemptyset(&intmask);
5865		sigaddset(&intmask, sigmasked);
5866		sigprocmask(SIG_BLOCK, &intmask, NULL);
5867
5868		DPRINTF("Before raising %s from child\n", strsignal(sigval));
5869		FORKEE_ASSERT(raise(sigval) == 0);
5870
5871		FORKEE_ASSERT((child2 = fork()) != -1);
5872
5873		if (child2 == 0)
5874			_exit(exitval2);
5875
5876		FORKEE_REQUIRE_SUCCESS
5877			(wpid = TWAIT_GENERIC(child2, &status, 0), child2);
5878
5879		forkee_status_exited(status, exitval2);
5880
5881		DPRINTF("Before exiting of the child process\n");
5882		_exit(exitval);
5883	}
5884	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
5885
5886	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5887	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5888
5889	validate_status_stopped(status, sigval);
5890
5891	DPRINTF("Enable PTRACE_VFORK in EVENT_MASK for the child %d\n", child);
5892	event.pe_set_event = PTRACE_VFORK;
5893	SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1 || errno == ENOTSUP);
5894
5895	DPRINTF("Before resuming the child process where it left off and "
5896	    "without signal to be sent\n");
5897	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
5898
5899	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
5900	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5901
5902	validate_status_stopped(status, sigmasked);
5903
5904	SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1);
5905	ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_VFORK);
5906
5907	child2 = state.pe_other_pid;
5908	DPRINTF("Reported PTRACE_VFORK event with forkee %d\n", child2);
5909
5910	DPRINTF("Before calling %s() for the child2\n", TWAIT_FNAME);
5911	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child2, &status, 0),
5912	    child2);
5913
5914	validate_status_stopped(status, SIGTRAP);
5915
5916	SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child2, &state, slen) != -1);
5917	ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_VFORK);
5918	ATF_REQUIRE_EQ(state.pe_other_pid, child);
5919
5920	DPRINTF("Before resuming the forkee process where it left off and "
5921	    "without signal to be sent\n");
5922	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child2, (void *)1, 0) != -1);
5923
5924	DPRINTF("Before resuming the child process where it left off and "
5925	    "without signal to be sent\n");
5926	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
5927
5928	DPRINTF("Before calling %s() for the forkee - expected exited\n",
5929	    TWAIT_FNAME);
5930	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child2, &status, 0),
5931	    child2);
5932
5933	validate_status_exited(status, exitval2);
5934
5935	DPRINTF("Before calling %s() for the forkee - expected no process\n",
5936	    TWAIT_FNAME);
5937	TWAIT_REQUIRE_FAILURE(ECHILD,
5938	    wpid = TWAIT_GENERIC(child2, &status, 0));
5939
5940	DPRINTF("Before calling %s() for the child - expected stopped "
5941	    "SIGCHLD\n", TWAIT_FNAME);
5942	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5943
5944	validate_status_stopped(status, SIGCHLD);
5945
5946	DPRINTF("Before resuming the child process where it left off and "
5947	    "without signal to be sent\n");
5948	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
5949
5950	DPRINTF("Before calling %s() for the child - expected exited\n",
5951	    TWAIT_FNAME);
5952	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
5953
5954	validate_status_exited(status, exitval);
5955
5956	DPRINTF("Before calling %s() for the child - expected no process\n",
5957	    TWAIT_FNAME);
5958	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
5959}
5960#endif
5961
5962ATF_TC(signal8);
5963ATF_TC_HEAD(signal8, tc)
5964{
5965	atf_tc_set_md_var(tc, "descr",
5966	    "Verify that masking SIGTRAP in tracee does not stop tracer from "
5967	    "catching PTRACE_VFORK_DONE breakpoint");
5968}
5969
5970ATF_TC_BODY(signal8, tc)
5971{
5972	const int exitval = 5;
5973	const int exitval2 = 15;
5974	const int sigval = SIGSTOP;
5975	const int sigmasked = SIGTRAP;
5976	pid_t child, child2, wpid;
5977#if defined(TWAIT_HAVE_STATUS)
5978	int status;
5979#endif
5980	sigset_t intmask;
5981	ptrace_state_t state;
5982	const int slen = sizeof(state);
5983	ptrace_event_t event;
5984	const int elen = sizeof(event);
5985
5986	atf_tc_expect_fail("PR kern/51918");
5987
5988	DPRINTF("Before forking process PID=%d\n", getpid());
5989	SYSCALL_REQUIRE((child = fork()) != -1);
5990	if (child == 0) {
5991		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
5992		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
5993
5994		sigemptyset(&intmask);
5995		sigaddset(&intmask, sigmasked);
5996		sigprocmask(SIG_BLOCK, &intmask, NULL);
5997
5998		DPRINTF("Before raising %s from child\n", strsignal(sigval));
5999		FORKEE_ASSERT(raise(sigval) == 0);
6000
6001		FORKEE_ASSERT((child2 = vfork()) != -1);
6002
6003		if (child2 == 0)
6004			_exit(exitval2);
6005
6006		FORKEE_REQUIRE_SUCCESS
6007			(wpid = TWAIT_GENERIC(child2, &status, 0), child2);
6008
6009		forkee_status_exited(status, exitval2);
6010
6011		DPRINTF("Before exiting of the child process\n");
6012		_exit(exitval);
6013	}
6014	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
6015
6016	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
6017	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
6018
6019	validate_status_stopped(status, sigval);
6020
6021	DPRINTF("Enable PTRACE_VFORK_DONE in EVENT_MASK for the child %d\n",
6022	    child);
6023	event.pe_set_event = PTRACE_VFORK_DONE;
6024	SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1);
6025
6026	DPRINTF("Before resuming the child process where it left off and "
6027	    "without signal to be sent\n");
6028	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
6029
6030	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
6031	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
6032
6033	validate_status_stopped(status, sigmasked);
6034
6035	SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1);
6036	ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_VFORK_DONE);
6037
6038	child2 = state.pe_other_pid;
6039	DPRINTF("Reported PTRACE_VFORK_DONE event with forkee %d\n", child2);
6040
6041	DPRINTF("Before resuming the child process where it left off and "
6042	    "without signal to be sent\n");
6043	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
6044
6045	DPRINTF("Before calling %s() for the child - expected stopped "
6046	    "SIGCHLD\n", TWAIT_FNAME);
6047	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
6048
6049	validate_status_stopped(status, SIGCHLD);
6050
6051	DPRINTF("Before resuming the child process where it left off and "
6052	    "without signal to be sent\n");
6053	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
6054
6055	DPRINTF("Before calling %s() for the child - expected exited\n",
6056	    TWAIT_FNAME);
6057	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
6058
6059	validate_status_exited(status, exitval);
6060
6061	DPRINTF("Before calling %s() for the child - expected no process\n",
6062	    TWAIT_FNAME);
6063	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
6064}
6065
6066ATF_TC(signal9);
6067ATF_TC_HEAD(signal9, tc)
6068{
6069	atf_tc_set_md_var(tc, "descr",
6070	    "Verify that masking SIGTRAP in tracee does not stop tracer from "
6071	    "catching PTRACE_LWP_CREATE breakpoint");
6072}
6073
6074ATF_TC_BODY(signal9, tc)
6075{
6076	const int exitval = 5;
6077	const int sigval = SIGSTOP;
6078	const int sigmasked = SIGTRAP;
6079	pid_t child, wpid;
6080#if defined(TWAIT_HAVE_STATUS)
6081	int status;
6082#endif
6083	sigset_t intmask;
6084	ptrace_state_t state;
6085	const int slen = sizeof(state);
6086	ptrace_event_t event;
6087	const int elen = sizeof(event);
6088	ucontext_t uc;
6089	lwpid_t lid;
6090	static const size_t ssize = 16*1024;
6091	void *stack;
6092
6093	atf_tc_expect_fail("PR kern/51918");
6094
6095	DPRINTF("Before forking process PID=%d\n", getpid());
6096	SYSCALL_REQUIRE((child = fork()) != -1);
6097	if (child == 0) {
6098		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
6099		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
6100
6101		sigemptyset(&intmask);
6102		sigaddset(&intmask, sigmasked);
6103		sigprocmask(SIG_BLOCK, &intmask, NULL);
6104
6105		DPRINTF("Before raising %s from child\n", strsignal(sigval));
6106		FORKEE_ASSERT(raise(sigval) == 0);
6107
6108		DPRINTF("Before allocating memory for stack in child\n");
6109		FORKEE_ASSERT((stack = malloc(ssize)) != NULL);
6110
6111		DPRINTF("Before making context for new lwp in child\n");
6112		_lwp_makecontext(&uc, lwp_main_func, NULL, NULL, stack, ssize);
6113
6114		DPRINTF("Before creating new in child\n");
6115		FORKEE_ASSERT(_lwp_create(&uc, 0, &lid) == 0);
6116
6117		DPRINTF("Before waiting for lwp %d to exit\n", lid);
6118		FORKEE_ASSERT(_lwp_wait(lid, NULL) == 0);
6119
6120		DPRINTF("Before verifying that reported %d and running lid %d "
6121		    "are the same\n", lid, the_lwp_id);
6122		FORKEE_ASSERT_EQ(lid, the_lwp_id);
6123
6124		DPRINTF("Before exiting of the child process\n");
6125		_exit(exitval);
6126	}
6127	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
6128
6129	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
6130	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
6131
6132	validate_status_stopped(status, sigval);
6133
6134	DPRINTF("Set empty EVENT_MASK for the child %d\n", child);
6135	event.pe_set_event = PTRACE_LWP_CREATE;
6136	SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1);
6137
6138	DPRINTF("Before resuming the child process where it left off and "
6139	    "without signal to be sent\n");
6140	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
6141
6142	DPRINTF("Before calling %s() for the child - expected stopped "
6143	    "SIGTRAP\n", TWAIT_FNAME);
6144	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
6145
6146	validate_status_stopped(status, sigmasked);
6147
6148	SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1);
6149
6150	ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_LWP_CREATE);
6151
6152	lid = state.pe_lwp;
6153	DPRINTF("Reported PTRACE_LWP_CREATE event with lid %d\n", lid);
6154
6155	DPRINTF("Before resuming the child process where it left off and "
6156	    "without signal to be sent\n");
6157	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
6158
6159	DPRINTF("Before calling %s() for the child - expected exited\n",
6160	    TWAIT_FNAME);
6161	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
6162
6163	validate_status_exited(status, exitval);
6164
6165	DPRINTF("Before calling %s() for the child - expected no process\n",
6166	    TWAIT_FNAME);
6167	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
6168}
6169
6170ATF_TC(signal10);
6171ATF_TC_HEAD(signal10, tc)
6172{
6173	atf_tc_set_md_var(tc, "descr",
6174	    "Verify that masking SIGTRAP in tracee does not stop tracer from "
6175	    "catching PTRACE_LWP_EXIT breakpoint");
6176}
6177
6178ATF_TC_BODY(signal10, tc)
6179{
6180	const int exitval = 5;
6181	const int sigval = SIGSTOP;
6182	const int sigmasked = SIGTRAP;
6183	pid_t child, wpid;
6184#if defined(TWAIT_HAVE_STATUS)
6185	int status;
6186#endif
6187	sigset_t intmask;
6188	ptrace_state_t state;
6189	const int slen = sizeof(state);
6190	ptrace_event_t event;
6191	const int elen = sizeof(event);
6192	ucontext_t uc;
6193	lwpid_t lid;
6194	static const size_t ssize = 16*1024;
6195	void *stack;
6196
6197	atf_tc_expect_fail("PR kern/51918");
6198
6199	DPRINTF("Before forking process PID=%d\n", getpid());
6200	SYSCALL_REQUIRE((child = fork()) != -1);
6201	if (child == 0) {
6202		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
6203		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
6204
6205		sigemptyset(&intmask);
6206		sigaddset(&intmask, sigmasked);
6207		sigprocmask(SIG_BLOCK, &intmask, NULL);
6208
6209		DPRINTF("Before raising %s from child\n", strsignal(sigval));
6210		FORKEE_ASSERT(raise(sigval) == 0);
6211
6212		DPRINTF("Before allocating memory for stack in child\n");
6213		FORKEE_ASSERT((stack = malloc(ssize)) != NULL);
6214
6215		DPRINTF("Before making context for new lwp in child\n");
6216		_lwp_makecontext(&uc, lwp_main_func, NULL, NULL, stack, ssize);
6217
6218		DPRINTF("Before creating new in child\n");
6219		FORKEE_ASSERT(_lwp_create(&uc, 0, &lid) == 0);
6220
6221		DPRINTF("Before waiting for lwp %d to exit\n", lid);
6222		FORKEE_ASSERT(_lwp_wait(lid, NULL) == 0);
6223
6224		DPRINTF("Before verifying that reported %d and running lid %d "
6225		    "are the same\n", lid, the_lwp_id);
6226		FORKEE_ASSERT_EQ(lid, the_lwp_id);
6227
6228		DPRINTF("Before exiting of the child process\n");
6229		_exit(exitval);
6230	}
6231	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
6232
6233	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
6234	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
6235
6236	validate_status_stopped(status, sigval);
6237
6238	DPRINTF("Set empty EVENT_MASK for the child %d\n", child);
6239	event.pe_set_event = PTRACE_LWP_EXIT;
6240	SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1);
6241
6242	DPRINTF("Before resuming the child process where it left off and "
6243	    "without signal to be sent\n");
6244	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
6245
6246	DPRINTF("Before calling %s() for the child - expected stopped "
6247	    "SIGTRAP\n", TWAIT_FNAME);
6248	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
6249
6250	validate_status_stopped(status, sigmasked);
6251
6252	SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1);
6253
6254	ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_LWP_EXIT);
6255
6256	lid = state.pe_lwp;
6257	DPRINTF("Reported PTRACE_LWP_EXIT event with lid %d\n", lid);
6258
6259	DPRINTF("Before resuming the child process where it left off and "
6260	    "without signal to be sent\n");
6261	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
6262
6263	DPRINTF("Before calling %s() for the child - expected exited\n",
6264	    TWAIT_FNAME);
6265	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
6266
6267	validate_status_exited(status, exitval);
6268
6269	DPRINTF("Before calling %s() for the child - expected no process\n",
6270	    TWAIT_FNAME);
6271	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
6272}
6273
6274static void
6275lwp_main_stop(void *arg)
6276{
6277	the_lwp_id = _lwp_self();
6278
6279	raise(SIGTRAP);
6280
6281	_lwp_exit();
6282}
6283
6284ATF_TC(suspend1);
6285ATF_TC_HEAD(suspend1, tc)
6286{
6287	atf_tc_set_md_var(tc, "descr",
6288	    "Verify that a thread can be suspended by a debugger and later "
6289	    "resumed by a tracee");
6290}
6291
6292ATF_TC_BODY(suspend1, tc)
6293{
6294	const int exitval = 5;
6295	const int sigval = SIGSTOP;
6296	pid_t child, wpid;
6297#if defined(TWAIT_HAVE_STATUS)
6298	int status;
6299#endif
6300	ucontext_t uc;
6301	lwpid_t lid;
6302	static const size_t ssize = 16*1024;
6303	void *stack;
6304	struct ptrace_lwpinfo pl;
6305	struct ptrace_siginfo psi;
6306	volatile int go = 0;
6307
6308	// Feature pending for refactoring
6309	atf_tc_expect_fail("PR kern/51995");
6310
6311	// Hangs with qemu
6312	ATF_REQUIRE(0 && "In order to get reliable failure, abort");
6313
6314	DPRINTF("Before forking process PID=%d\n", getpid());
6315	SYSCALL_REQUIRE((child = fork()) != -1);
6316	if (child == 0) {
6317		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
6318		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
6319
6320		DPRINTF("Before raising %s from child\n", strsignal(sigval));
6321		FORKEE_ASSERT(raise(sigval) == 0);
6322
6323		DPRINTF("Before allocating memory for stack in child\n");
6324		FORKEE_ASSERT((stack = malloc(ssize)) != NULL);
6325
6326		DPRINTF("Before making context for new lwp in child\n");
6327		_lwp_makecontext(&uc, lwp_main_stop, NULL, NULL, stack, ssize);
6328
6329		DPRINTF("Before creating new in child\n");
6330		FORKEE_ASSERT(_lwp_create(&uc, 0, &lid) == 0);
6331
6332		while (go == 0)
6333			continue;
6334
6335		raise(SIGINT);
6336
6337		FORKEE_ASSERT(_lwp_continue(lid) == 0);
6338
6339		DPRINTF("Before waiting for lwp %d to exit\n", lid);
6340		FORKEE_ASSERT(_lwp_wait(lid, NULL) == 0);
6341
6342		DPRINTF("Before verifying that reported %d and running lid %d "
6343		    "are the same\n", lid, the_lwp_id);
6344		FORKEE_ASSERT_EQ(lid, the_lwp_id);
6345
6346		DPRINTF("Before exiting of the child process\n");
6347		_exit(exitval);
6348	}
6349	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
6350
6351	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
6352	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
6353
6354	validate_status_stopped(status, sigval);
6355
6356	DPRINTF("Before resuming the child process where it left off and "
6357	    "without signal to be sent\n");
6358	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
6359
6360	DPRINTF("Before calling %s() for the child - expected stopped "
6361	    "SIGTRAP\n", TWAIT_FNAME);
6362	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
6363
6364	validate_status_stopped(status, SIGTRAP);
6365
6366	DPRINTF("Before reading siginfo and lwpid_t\n");
6367	SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &psi, sizeof(psi)) != -1);
6368
6369	DPRINTF("Before suspending LWP %d\n", psi.psi_lwpid);
6370	SYSCALL_REQUIRE(ptrace(PT_SUSPEND, child, NULL, psi.psi_lwpid) != -1);
6371
6372        DPRINTF("Write new go to tracee (PID=%d) from tracer (PID=%d)\n",
6373	    child, getpid());
6374	SYSCALL_REQUIRE(ptrace(PT_WRITE_D, child, __UNVOLATILE(&go), 1) != -1);
6375
6376	DPRINTF("Before resuming the child process where it left off and "
6377	    "without signal to be sent\n");
6378	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
6379
6380	DPRINTF("Before calling %s() for the child - expected stopped "
6381	    "SIGINT\n", TWAIT_FNAME);
6382	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
6383
6384	validate_status_stopped(status, SIGINT);
6385
6386	pl.pl_lwpid = 0;
6387
6388	SYSCALL_REQUIRE(ptrace(PT_LWPINFO, child, &pl, sizeof(pl)) != -1);
6389	while (pl.pl_lwpid != 0) {
6390
6391		SYSCALL_REQUIRE(ptrace(PT_LWPINFO, child, &pl, sizeof(pl)) != -1);
6392		switch (pl.pl_lwpid) {
6393		case 1:
6394			ATF_REQUIRE_EQ(pl.pl_event, PL_EVENT_SIGNAL);
6395			break;
6396		case 2:
6397			ATF_REQUIRE_EQ(pl.pl_event, PL_EVENT_SUSPENDED);
6398			break;
6399		}
6400	}
6401
6402	DPRINTF("Before resuming the child process where it left off and "
6403	    "without signal to be sent\n");
6404	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
6405
6406	DPRINTF("Before calling %s() for the child - expected exited\n",
6407	    TWAIT_FNAME);
6408	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
6409
6410	validate_status_exited(status, exitval);
6411
6412	DPRINTF("Before calling %s() for the child - expected no process\n",
6413	    TWAIT_FNAME);
6414	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
6415}
6416
6417ATF_TC(suspend2);
6418ATF_TC_HEAD(suspend2, tc)
6419{
6420	atf_tc_set_md_var(tc, "descr",
6421	    "Verify that the while the only thread within a process is "
6422	    "suspended, the whole process cannot be unstopped");
6423}
6424
6425ATF_TC_BODY(suspend2, tc)
6426{
6427	const int exitval = 5;
6428	const int sigval = SIGSTOP;
6429	pid_t child, wpid;
6430#if defined(TWAIT_HAVE_STATUS)
6431	int status;
6432#endif
6433	struct ptrace_siginfo psi;
6434
6435	// Feature pending for refactoring
6436	atf_tc_expect_fail("PR kern/51995");
6437
6438	// Hangs with qemu
6439	ATF_REQUIRE(0 && "In order to get reliable failure, abort");
6440
6441	DPRINTF("Before forking process PID=%d\n", getpid());
6442	SYSCALL_REQUIRE((child = fork()) != -1);
6443	if (child == 0) {
6444		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
6445		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
6446
6447		DPRINTF("Before raising %s from child\n", strsignal(sigval));
6448		FORKEE_ASSERT(raise(sigval) == 0);
6449
6450		DPRINTF("Before exiting of the child process\n");
6451		_exit(exitval);
6452	}
6453	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
6454
6455	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
6456	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
6457
6458	validate_status_stopped(status, sigval);
6459
6460	DPRINTF("Before reading siginfo and lwpid_t\n");
6461	SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &psi, sizeof(psi)) != -1);
6462
6463	DPRINTF("Before suspending LWP %d\n", psi.psi_lwpid);
6464	SYSCALL_REQUIRE(ptrace(PT_SUSPEND, child, NULL, psi.psi_lwpid) != -1);
6465
6466	DPRINTF("Before resuming the child process where it left off and "
6467	    "without signal to be sent\n");
6468	ATF_REQUIRE_ERRNO(EDEADLK,
6469	    ptrace(PT_CONTINUE, child, (void *)1, 0) == -1);
6470
6471	DPRINTF("Before resuming LWP %d\n", psi.psi_lwpid);
6472	SYSCALL_REQUIRE(ptrace(PT_RESUME, child, NULL, psi.psi_lwpid) != -1);
6473
6474	DPRINTF("Before resuming the child process where it left off and "
6475	    "without signal to be sent\n");
6476	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
6477
6478	DPRINTF("Before calling %s() for the child - expected exited\n",
6479	    TWAIT_FNAME);
6480	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
6481
6482	validate_status_exited(status, exitval);
6483
6484	DPRINTF("Before calling %s() for the child - expected no process\n",
6485	    TWAIT_FNAME);
6486	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
6487}
6488
6489ATF_TC(resume1);
6490ATF_TC_HEAD(resume1, tc)
6491{
6492	atf_tc_set_md_var(tc, "timeout", "5");
6493	atf_tc_set_md_var(tc, "descr",
6494	    "Verify that a thread can be suspended by a debugger and later "
6495	    "resumed by the debugger");
6496}
6497
6498ATF_TC_BODY(resume1, tc)
6499{
6500	struct msg_fds fds;
6501	const int exitval = 5;
6502	const int sigval = SIGSTOP;
6503	pid_t child, wpid;
6504	uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */
6505#if defined(TWAIT_HAVE_STATUS)
6506	int status;
6507#endif
6508	ucontext_t uc;
6509	lwpid_t lid;
6510	static const size_t ssize = 16*1024;
6511	void *stack;
6512	struct ptrace_lwpinfo pl;
6513	struct ptrace_siginfo psi;
6514
6515	// Feature pending for refactoring
6516	atf_tc_expect_fail("PR kern/51995");
6517
6518	// Hangs with qemu
6519	ATF_REQUIRE(0 && "In order to get reliable failure, abort");
6520
6521	SYSCALL_REQUIRE(msg_open(&fds) == 0);
6522
6523	DPRINTF("Before forking process PID=%d\n", getpid());
6524	SYSCALL_REQUIRE((child = fork()) != -1);
6525	if (child == 0) {
6526		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
6527		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
6528
6529		DPRINTF("Before raising %s from child\n", strsignal(sigval));
6530		FORKEE_ASSERT(raise(sigval) == 0);
6531
6532		DPRINTF("Before allocating memory for stack in child\n");
6533		FORKEE_ASSERT((stack = malloc(ssize)) != NULL);
6534
6535		DPRINTF("Before making context for new lwp in child\n");
6536		_lwp_makecontext(&uc, lwp_main_stop, NULL, NULL, stack, ssize);
6537
6538		DPRINTF("Before creating new in child\n");
6539		FORKEE_ASSERT(_lwp_create(&uc, 0, &lid) == 0);
6540
6541		CHILD_TO_PARENT("Message", fds, msg);
6542
6543		raise(SIGINT);
6544
6545		DPRINTF("Before waiting for lwp %d to exit\n", lid);
6546		FORKEE_ASSERT(_lwp_wait(lid, NULL) == 0);
6547
6548		DPRINTF("Before verifying that reported %d and running lid %d "
6549		    "are the same\n", lid, the_lwp_id);
6550		FORKEE_ASSERT_EQ(lid, the_lwp_id);
6551
6552		DPRINTF("Before exiting of the child process\n");
6553		_exit(exitval);
6554	}
6555	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
6556
6557	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
6558	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
6559
6560	validate_status_stopped(status, sigval);
6561
6562	DPRINTF("Before resuming the child process where it left off and "
6563	    "without signal to be sent\n");
6564	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
6565
6566	DPRINTF("Before calling %s() for the child - expected stopped "
6567	    "SIGTRAP\n", TWAIT_FNAME);
6568	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
6569
6570	validate_status_stopped(status, SIGTRAP);
6571
6572	DPRINTF("Before reading siginfo and lwpid_t\n");
6573	SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &psi, sizeof(psi)) != -1);
6574
6575	DPRINTF("Before suspending LWP %d\n", psi.psi_lwpid);
6576	SYSCALL_REQUIRE(ptrace(PT_SUSPEND, child, NULL, psi.psi_lwpid) != -1);
6577
6578	PARENT_FROM_CHILD("Message", fds, msg);
6579
6580	DPRINTF("Before resuming the child process where it left off and "
6581	    "without signal to be sent\n");
6582	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
6583
6584	DPRINTF("Before calling %s() for the child - expected stopped "
6585	    "SIGINT\n", TWAIT_FNAME);
6586	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
6587
6588	validate_status_stopped(status, SIGINT);
6589
6590	pl.pl_lwpid = 0;
6591
6592	SYSCALL_REQUIRE(ptrace(PT_LWPINFO, child, &pl, sizeof(pl)) != -1);
6593	while (pl.pl_lwpid != 0) {
6594		SYSCALL_REQUIRE(ptrace(PT_LWPINFO, child, &pl, sizeof(pl)) != -1);
6595		switch (pl.pl_lwpid) {
6596		case 1:
6597			ATF_REQUIRE_EQ(pl.pl_event, PL_EVENT_SIGNAL);
6598			break;
6599		case 2:
6600			ATF_REQUIRE_EQ(pl.pl_event, PL_EVENT_SUSPENDED);
6601			break;
6602		}
6603	}
6604
6605	DPRINTF("Before resuming LWP %d\n", psi.psi_lwpid);
6606	SYSCALL_REQUIRE(ptrace(PT_RESUME, child, NULL, psi.psi_lwpid) != -1);
6607
6608	DPRINTF("Before resuming the child process where it left off and "
6609	    "without signal to be sent\n");
6610	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
6611
6612	DPRINTF("Before calling %s() for the child - expected exited\n",
6613	    TWAIT_FNAME);
6614	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
6615
6616	validate_status_exited(status, exitval);
6617
6618	DPRINTF("Before calling %s() for the child - expected no process\n",
6619	    TWAIT_FNAME);
6620	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
6621
6622	msg_close(&fds);
6623
6624	DPRINTF("XXX: Test worked this time but for consistency timeout it\n");
6625	sleep(10);
6626}
6627
6628ATF_TC(syscall1);
6629ATF_TC_HEAD(syscall1, tc)
6630{
6631	atf_tc_set_md_var(tc, "descr",
6632	    "Verify that getpid(2) can be traced with PT_SYSCALL");
6633}
6634
6635ATF_TC_BODY(syscall1, tc)
6636{
6637	const int exitval = 5;
6638	const int sigval = SIGSTOP;
6639	pid_t child, wpid;
6640#if defined(TWAIT_HAVE_STATUS)
6641	int status;
6642#endif
6643	struct ptrace_siginfo info;
6644	memset(&info, 0, sizeof(info));
6645
6646	DPRINTF("Before forking process PID=%d\n", getpid());
6647	SYSCALL_REQUIRE((child = fork()) != -1);
6648	if (child == 0) {
6649		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
6650		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
6651
6652		DPRINTF("Before raising %s from child\n", strsignal(sigval));
6653		FORKEE_ASSERT(raise(sigval) == 0);
6654
6655		syscall(SYS_getpid);
6656
6657		DPRINTF("Before exiting of the child process\n");
6658		_exit(exitval);
6659	}
6660	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
6661
6662	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
6663	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
6664
6665	validate_status_stopped(status, sigval);
6666
6667	DPRINTF("Before resuming the child process where it left off and "
6668	    "without signal to be sent\n");
6669	SYSCALL_REQUIRE(ptrace(PT_SYSCALL, child, (void *)1, 0) != -1);
6670
6671	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
6672	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
6673
6674	validate_status_stopped(status, SIGTRAP);
6675
6676	DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
6677	SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
6678
6679	ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, SIGTRAP);
6680	ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_SCE);
6681
6682	DPRINTF("Before resuming the child process where it left off and "
6683	    "without signal to be sent\n");
6684	SYSCALL_REQUIRE(ptrace(PT_SYSCALL, child, (void *)1, 0) != -1);
6685
6686	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
6687	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
6688
6689	validate_status_stopped(status, SIGTRAP);
6690
6691	DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
6692	SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
6693
6694	DPRINTF("Before checking siginfo_t\n");
6695	ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, SIGTRAP);
6696	ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_SCX);
6697
6698	DPRINTF("Before resuming the child process where it left off and "
6699	    "without signal to be sent\n");
6700	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
6701
6702	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
6703	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
6704
6705	validate_status_exited(status, exitval);
6706
6707	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
6708	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
6709}
6710
6711ATF_TC(syscallemu1);
6712ATF_TC_HEAD(syscallemu1, tc)
6713{
6714	atf_tc_set_md_var(tc, "descr",
6715	    "Verify that exit(2) can be intercepted with PT_SYSCALLEMU");
6716}
6717
6718ATF_TC_BODY(syscallemu1, tc)
6719{
6720	const int exitval = 5;
6721	const int sigval = SIGSTOP;
6722	pid_t child, wpid;
6723#if defined(TWAIT_HAVE_STATUS)
6724	int status;
6725#endif
6726
6727#if defined(__sparc__) && !defined(__sparc64__)
6728	/* syscallemu does not work on sparc (32-bit) */
6729	atf_tc_expect_fail("PR kern/52166");
6730#endif
6731
6732	DPRINTF("Before forking process PID=%d\n", getpid());
6733	SYSCALL_REQUIRE((child = fork()) != -1);
6734	if (child == 0) {
6735		DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
6736		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
6737
6738		DPRINTF("Before raising %s from child\n", strsignal(sigval));
6739		FORKEE_ASSERT(raise(sigval) == 0);
6740
6741		syscall(SYS_exit, 100);
6742
6743		DPRINTF("Before exiting of the child process\n");
6744		_exit(exitval);
6745	}
6746	DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
6747
6748	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
6749	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
6750
6751	validate_status_stopped(status, sigval);
6752
6753	DPRINTF("Before resuming the child process where it left off and "
6754	    "without signal to be sent\n");
6755	SYSCALL_REQUIRE(ptrace(PT_SYSCALL, child, (void *)1, 0) != -1);
6756
6757	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
6758	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
6759
6760	validate_status_stopped(status, SIGTRAP);
6761
6762	DPRINTF("Set SYSCALLEMU for intercepted syscall\n");
6763	SYSCALL_REQUIRE(ptrace(PT_SYSCALLEMU, child, (void *)1, 0) != -1);
6764
6765	DPRINTF("Before resuming the child process where it left off and "
6766	    "without signal to be sent\n");
6767	SYSCALL_REQUIRE(ptrace(PT_SYSCALL, child, (void *)1, 0) != -1);
6768
6769	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
6770	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
6771
6772	validate_status_stopped(status, SIGTRAP);
6773
6774	DPRINTF("Before resuming the child process where it left off and "
6775	    "without signal to be sent\n");
6776	SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
6777
6778	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
6779	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
6780
6781	validate_status_exited(status, exitval);
6782
6783	DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
6784	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
6785}
6786
6787#if defined(TWAIT_HAVE_PID)
6788ATF_TC(race1);
6789ATF_TC_HEAD(race1, tc)
6790{
6791	atf_tc_set_md_var(tc, "descr",
6792	    "Assert that await_zombie() in attach1 always finds a single "
6793	    "process and no other error is reported");
6794}
6795
6796ATF_TC_BODY(race1, tc)
6797{
6798	time_t start, end;
6799	double diff;
6800	unsigned long N = 0;
6801
6802	/* Reuse this test with attach1 */
6803
6804	start = time(NULL);
6805	while (true) {
6806		DPRINTF("Step: %lu\n", N);
6807		attach1_raw(true);
6808		end = time(NULL);
6809		diff = difftime(end, start);
6810		if (diff >= 5.0)
6811			break;
6812		++N;
6813	}
6814	DPRINTF("Iterations: %lu\n", N);
6815}
6816#endif
6817
6818#include "t_ptrace_amd64_wait.h"
6819#include "t_ptrace_i386_wait.h"
6820#include "t_ptrace_x86_wait.h"
6821
6822ATF_TP_ADD_TCS(tp)
6823{
6824	setvbuf(stdout, NULL, _IONBF, 0);
6825	setvbuf(stderr, NULL, _IONBF, 0);
6826
6827	ATF_TP_ADD_TC(tp, traceme_raise1);
6828	ATF_TP_ADD_TC(tp, traceme_raise2);
6829	ATF_TP_ADD_TC(tp, traceme_raise3);
6830	ATF_TP_ADD_TC(tp, traceme_raise4);
6831	ATF_TP_ADD_TC(tp, traceme_raise5);
6832
6833	ATF_TP_ADD_TC(tp, traceme_sighandler_catch1);
6834	ATF_TP_ADD_TC(tp, traceme_sighandler_catch2);
6835	ATF_TP_ADD_TC(tp, traceme_sighandler_catch3);
6836
6837	ATF_TP_ADD_TC(tp, traceme_signal_nohandler1);
6838//	ATF_TP_ADD_TC(tp, traceme_signal_nohandler2); // not yet
6839	ATF_TP_ADD_TC(tp, traceme_signal_nohandler3);
6840	ATF_TP_ADD_TC(tp, traceme_signal_nohandler4);
6841	ATF_TP_ADD_TC(tp, traceme_signal_nohandler5);
6842
6843	ATF_TP_ADD_TC(tp, traceme_pid1_parent);
6844
6845	ATF_TP_ADD_TC_HAVE_PID(tp, attach1);
6846	ATF_TP_ADD_TC_HAVE_PID(tp, attach2);
6847	ATF_TP_ADD_TC(tp, attach3);
6848	ATF_TP_ADD_TC(tp, attach4);
6849	ATF_TP_ADD_TC_HAVE_PID(tp, attach5);
6850	ATF_TP_ADD_TC_HAVE_PID(tp, attach6);
6851	ATF_TP_ADD_TC_HAVE_PID(tp, attach7);
6852
6853	ATF_TP_ADD_TC(tp, eventmask1);
6854	ATF_TP_ADD_TC(tp, eventmask2);
6855	ATF_TP_ADD_TC(tp, eventmask3);
6856	ATF_TP_ADD_TC(tp, eventmask4);
6857	ATF_TP_ADD_TC(tp, eventmask5);
6858	ATF_TP_ADD_TC(tp, eventmask6);
6859
6860	ATF_TP_ADD_TC(tp, fork1);
6861	ATF_TP_ADD_TC_HAVE_PID(tp, fork2);
6862	ATF_TP_ADD_TC_HAVE_PID(tp, fork3);
6863	ATF_TP_ADD_TC_HAVE_PID(tp, fork4);
6864	ATF_TP_ADD_TC(tp, fork5);
6865	ATF_TP_ADD_TC_HAVE_PID(tp, fork6);
6866	ATF_TP_ADD_TC_HAVE_PID(tp, fork7);
6867	ATF_TP_ADD_TC_HAVE_PID(tp, fork8);
6868
6869	ATF_TP_ADD_TC(tp, vfork1);
6870	ATF_TP_ADD_TC_HAVE_PID(tp, vfork2);
6871	ATF_TP_ADD_TC_HAVE_PID(tp, vfork3);
6872	ATF_TP_ADD_TC_HAVE_PID(tp, vfork4);
6873	ATF_TP_ADD_TC(tp, vfork5);
6874	ATF_TP_ADD_TC_HAVE_PID(tp, vfork6);
6875	ATF_TP_ADD_TC_HAVE_PID(tp, vfork7);
6876	ATF_TP_ADD_TC_HAVE_PID(tp, vfork8);
6877
6878	ATF_TP_ADD_TC(tp, io_read_d1);
6879	ATF_TP_ADD_TC(tp, io_read_d2);
6880	ATF_TP_ADD_TC(tp, io_read_d3);
6881	ATF_TP_ADD_TC(tp, io_read_d4);
6882
6883	ATF_TP_ADD_TC(tp, io_write_d1);
6884	ATF_TP_ADD_TC(tp, io_write_d2);
6885	ATF_TP_ADD_TC(tp, io_write_d3);
6886	ATF_TP_ADD_TC(tp, io_write_d4);
6887
6888	ATF_TP_ADD_TC(tp, read_d1);
6889	ATF_TP_ADD_TC(tp, read_d2);
6890	ATF_TP_ADD_TC(tp, read_d3);
6891	ATF_TP_ADD_TC(tp, read_d4);
6892
6893	ATF_TP_ADD_TC(tp, write_d1);
6894	ATF_TP_ADD_TC(tp, write_d2);
6895	ATF_TP_ADD_TC(tp, write_d3);
6896	ATF_TP_ADD_TC(tp, write_d4);
6897
6898	ATF_TP_ADD_TC(tp, io_read_d_write_d_handshake1);
6899	ATF_TP_ADD_TC(tp, io_read_d_write_d_handshake2);
6900
6901	ATF_TP_ADD_TC(tp, read_d_write_d_handshake1);
6902	ATF_TP_ADD_TC(tp, read_d_write_d_handshake2);
6903
6904	ATF_TP_ADD_TC(tp, io_read_i1);
6905	ATF_TP_ADD_TC(tp, io_read_i2);
6906	ATF_TP_ADD_TC(tp, io_read_i3);
6907	ATF_TP_ADD_TC(tp, io_read_i4);
6908
6909	ATF_TP_ADD_TC(tp, read_i1);
6910	ATF_TP_ADD_TC(tp, read_i2);
6911	ATF_TP_ADD_TC(tp, read_i3);
6912	ATF_TP_ADD_TC(tp, read_i4);
6913
6914	ATF_TP_ADD_TC(tp, io_read_auxv1);
6915
6916	ATF_TP_ADD_TC_HAVE_GPREGS(tp, regs1);
6917	ATF_TP_ADD_TC_HAVE_GPREGS(tp, regs2);
6918	ATF_TP_ADD_TC_HAVE_GPREGS(tp, regs3);
6919	ATF_TP_ADD_TC_HAVE_GPREGS(tp, regs4);
6920	ATF_TP_ADD_TC_HAVE_GPREGS(tp, regs5);
6921
6922	ATF_TP_ADD_TC_HAVE_FPREGS(tp, fpregs1);
6923	ATF_TP_ADD_TC_HAVE_FPREGS(tp, fpregs2);
6924
6925	ATF_TP_ADD_TC_PT_STEP(tp, step1);
6926	ATF_TP_ADD_TC_PT_STEP(tp, step2);
6927	ATF_TP_ADD_TC_PT_STEP(tp, step3);
6928	ATF_TP_ADD_TC_PT_STEP(tp, step4);
6929
6930	ATF_TP_ADD_TC_PT_STEP(tp, setstep1);
6931	ATF_TP_ADD_TC_PT_STEP(tp, setstep2);
6932	ATF_TP_ADD_TC_PT_STEP(tp, setstep3);
6933	ATF_TP_ADD_TC_PT_STEP(tp, setstep4);
6934
6935	ATF_TP_ADD_TC(tp, kill1);
6936	ATF_TP_ADD_TC(tp, kill2);
6937
6938	ATF_TP_ADD_TC(tp, lwpinfo1);
6939	ATF_TP_ADD_TC_HAVE_PID(tp, lwpinfo2);
6940
6941	ATF_TP_ADD_TC(tp, siginfo1);
6942	ATF_TP_ADD_TC(tp, siginfo2);
6943	ATF_TP_ADD_TC(tp, siginfo3);
6944	ATF_TP_ADD_TC(tp, siginfo4);
6945	ATF_TP_ADD_TC_HAVE_PID(tp, siginfo5);
6946	ATF_TP_ADD_TC_PT_STEP(tp, siginfo6);
6947
6948	ATF_TP_ADD_TC(tp, lwp_create1);
6949
6950	ATF_TP_ADD_TC(tp, lwp_exit1);
6951
6952	ATF_TP_ADD_TC(tp, signal1);
6953	ATF_TP_ADD_TC(tp, signal2);
6954	ATF_TP_ADD_TC(tp, signal3);
6955	ATF_TP_ADD_TC_PT_STEP(tp, signal4);
6956	ATF_TP_ADD_TC(tp, signal5);
6957	ATF_TP_ADD_TC_HAVE_PID(tp, signal6);
6958	ATF_TP_ADD_TC_HAVE_PID(tp, signal7);
6959	ATF_TP_ADD_TC(tp, signal8);
6960	ATF_TP_ADD_TC(tp, signal9);
6961	ATF_TP_ADD_TC(tp, signal10);
6962
6963	ATF_TP_ADD_TC(tp, suspend1);
6964	ATF_TP_ADD_TC(tp, suspend2);
6965
6966	ATF_TP_ADD_TC(tp, resume1);
6967
6968	ATF_TP_ADD_TC(tp, syscall1);
6969
6970	ATF_TP_ADD_TC(tp, syscallemu1);
6971
6972	ATF_TP_ADD_TC_HAVE_PID(tp, race1);
6973
6974	ATF_TP_ADD_TCS_PTRACE_WAIT_AMD64();
6975	ATF_TP_ADD_TCS_PTRACE_WAIT_I386();
6976	ATF_TP_ADD_TCS_PTRACE_WAIT_X86();
6977
6978	return atf_no_error();
6979}
6980