xref: /netbsd-src/tests/lib/libc/sys/t_ptrace_x86_wait.h (revision 796c32c94f6e154afc9de0f63da35c91bb739b45)
1 /*	$NetBSD: t_ptrace_x86_wait.h,v 1.1 2017/04/02 21:44: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 #if defined(__i386__) || defined(__x86_64__)
30 union u {
31 	unsigned long raw;
32 	struct {
33 		unsigned long local_dr0_breakpoint : 1;		/* 0 */
34 		unsigned long global_dr0_breakpoint : 1;	/* 1 */
35 		unsigned long local_dr1_breakpoint : 1;		/* 2 */
36 		unsigned long global_dr1_breakpoint : 1;	/* 3 */
37 		unsigned long local_dr2_breakpoint : 1;		/* 4 */
38 		unsigned long global_dr2_breakpoint : 1;	/* 5 */
39 		unsigned long local_dr3_breakpoint : 1;		/* 6 */
40 		unsigned long global_dr3_breakpoint : 1;	/* 7 */
41 		unsigned long local_exact_breakpt : 1;		/* 8 */
42 		unsigned long global_exact_breakpt : 1;		/* 9 */
43 		unsigned long reserved_10 : 1;			/* 10 */
44 		unsigned long rest_trans_memory : 1;		/* 11 */
45 		unsigned long reserved_12 : 1;			/* 12 */
46 		unsigned long general_detect_enable : 1;	/* 13 */
47 		unsigned long reserved_14 : 1;			/* 14 */
48 		unsigned long reserved_15 : 1;			/* 15 */
49 		unsigned long condition_dr0 : 2;		/* 16-17 */
50 		unsigned long len_dr0 : 2;			/* 18-19 */
51 		unsigned long condition_dr1 : 2;		/* 20-21 */
52 		unsigned long len_dr1 : 2;			/* 22-23 */
53 		unsigned long condition_dr2 : 2;		/* 24-25 */
54 		unsigned long len_dr2 : 2;			/* 26-27 */
55 		unsigned long condition_dr3 : 2;		/* 28-29 */
56 		unsigned long len_dr3 : 2;			/* 30-31 */
57 	} bits;
58 };
59 
60 ATF_TC(dbregs_print);
61 ATF_TC_HEAD(dbregs_print, tc)
62 {
63 	atf_tc_set_md_var(tc, "descr",
64 	    "Verify plain PT_GETDBREGS with printing Debug Registers");
65 }
66 
67 ATF_TC_BODY(dbregs_print, tc)
68 {
69 	const int exitval = 5;
70 	const int sigval = SIGSTOP;
71 	pid_t child, wpid;
72 #if defined(TWAIT_HAVE_STATUS)
73 	int status;
74 #endif
75 	struct dbreg r;
76 	size_t i;
77 
78 	printf("Before forking process PID=%d\n", getpid());
79 	ATF_REQUIRE((child = fork()) != -1);
80 	if (child == 0) {
81 		printf("Before calling PT_TRACE_ME from child %d\n", getpid());
82 		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
83 
84 		printf("Before raising %s from child\n", strsignal(sigval));
85 		FORKEE_ASSERT(raise(sigval) == 0);
86 
87 		printf("Before exiting of the child process\n");
88 		_exit(exitval);
89 	}
90 	printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
91 
92 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
93 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
94 
95 	validate_status_stopped(status, sigval);
96 
97 	printf("Call GETDBREGS for the child process\n");
98 	ATF_REQUIRE(ptrace(PT_GETDBREGS, child, &r, 0) != -1);
99 
100 	printf("State of the debug registers:\n");
101 	for (i = 0; i < __arraycount(r.dr); i++)
102 		printf("r[%zu]=%" PRIxREGISTER "\n", i, r.dr[i]);
103 
104 	printf("Before resuming the child process where it left off and "
105 	    "without signal to be sent\n");
106 	ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
107 
108 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
109 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
110 
111 	validate_status_exited(status, exitval);
112 
113 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
114 	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
115 }
116 
117 
118 enum dbreg_preserve_mode {
119 	dbreg_preserve_mode_none,
120 	dbreg_preserve_mode_yield,
121 	dbreg_preserve_mode_continued
122 };
123 
124 static void
125 dbreg_preserve(int reg, enum dbreg_preserve_mode mode)
126 {
127 	const int exitval = 5;
128 	const int sigval = SIGSTOP;
129 	pid_t child, wpid;
130 #if defined(TWAIT_HAVE_STATUS)
131 	int status;
132 #endif
133 	struct dbreg r1;
134 	struct dbreg r2;
135 	size_t i;
136 	int watchme;
137 
138 	printf("Before forking process PID=%d\n", getpid());
139 	ATF_REQUIRE((child = fork()) != -1);
140 	if (child == 0) {
141 		printf("Before calling PT_TRACE_ME from child %d\n", getpid());
142 		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
143 
144 		printf("Before raising %s from child\n", strsignal(sigval));
145 		FORKEE_ASSERT(raise(sigval) == 0);
146 
147 		if (mode == dbreg_preserve_mode_continued) {
148 			printf("Before raising %s from child\n",
149 			       strsignal(sigval));
150 			FORKEE_ASSERT(raise(sigval) == 0);
151 		}
152 
153 		printf("Before exiting of the child process\n");
154 		_exit(exitval);
155 	}
156 	printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
157 
158 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
159 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
160 
161 	validate_status_stopped(status, sigval);
162 
163 	printf("Call GETDBREGS for the child process (r1)\n");
164 	ATF_REQUIRE(ptrace(PT_GETDBREGS, child, &r1, 0) != -1);
165 
166 	printf("State of the debug registers (r1):\n");
167 	for (i = 0; i < __arraycount(r1.dr); i++)
168 		printf("r1[%zu]=%" PRIxREGISTER "\n", i, r1.dr[i]);
169 
170 	r1.dr[reg] = (long)(intptr_t)&watchme;
171 	printf("Set DR0 (r1.dr[%d]) to new value %" PRIxREGISTER "\n",
172 	    reg, r1.dr[reg]);
173 
174 	printf("New state of the debug registers (r1):\n");
175 	for (i = 0; i < __arraycount(r1.dr); i++)
176 		printf("r1[%zu]=%" PRIxREGISTER "\n", i, r1.dr[i]);
177 
178 	printf("Call SETDBREGS for the child process (r1)\n");
179 	ATF_REQUIRE(ptrace(PT_SETDBREGS, child, &r1, 0) != -1);
180 
181 	switch (mode) {
182 	case dbreg_preserve_mode_none:
183 		break;
184 	case dbreg_preserve_mode_yield:
185 		printf("Yields a processor voluntarily and gives other "
186 		       "threads a chance to run without waiting for an "
187 		       "involuntary preemptive switch\n");
188 		sched_yield();
189 		break;
190 	case dbreg_preserve_mode_continued:
191 		printf("Call CONTINUE for the child process\n");
192 	        ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
193 
194 		printf("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 		break;
199 	}
200 
201 	printf("Call GETDBREGS for the child process (r2)\n");
202 	ATF_REQUIRE(ptrace(PT_GETDBREGS, child, &r2, 0) != -1);
203 
204 	printf("Assert that (r1) and (r2) are the same\n");
205 	ATF_REQUIRE(memcmp(&r1, &r2, sizeof(r1)) == 0);
206 
207 	printf("Before resuming the child process where it left off and "
208 	    "without signal to be sent\n");
209 	ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
210 
211 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
212 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
213 
214 	validate_status_exited(status, exitval);
215 
216 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
217 	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
218 }
219 
220 
221 ATF_TC(dbregs_preserve_dr0);
222 ATF_TC_HEAD(dbregs_preserve_dr0, tc)
223 {
224 	atf_tc_set_md_var(tc, "descr",
225 	    "Verify that setting DR0 is preserved across ptrace(2) calls");
226 }
227 
228 ATF_TC_BODY(dbregs_preserve_dr0, tc)
229 {
230 	dbreg_preserve(0, dbreg_preserve_mode_none);
231 }
232 
233 ATF_TC(dbregs_preserve_dr1);
234 ATF_TC_HEAD(dbregs_preserve_dr1, tc)
235 {
236 	atf_tc_set_md_var(tc, "descr",
237 	    "Verify that setting DR1 is preserved across ptrace(2) calls");
238 }
239 
240 ATF_TC_BODY(dbregs_preserve_dr1, tc)
241 {
242 	dbreg_preserve(1, dbreg_preserve_mode_none);
243 }
244 
245 ATF_TC(dbregs_preserve_dr2);
246 ATF_TC_HEAD(dbregs_preserve_dr2, tc)
247 {
248 	atf_tc_set_md_var(tc, "descr",
249 	    "Verify that setting DR2 is preserved across ptrace(2) calls");
250 }
251 
252 ATF_TC_BODY(dbregs_preserve_dr2, tc)
253 {
254 	dbreg_preserve(2, dbreg_preserve_mode_none);
255 }
256 
257 ATF_TC(dbregs_preserve_dr3);
258 ATF_TC_HEAD(dbregs_preserve_dr3, tc)
259 {
260 	atf_tc_set_md_var(tc, "descr",
261 	    "Verify that setting DR3 is preserved across ptrace(2) calls");
262 }
263 
264 ATF_TC_BODY(dbregs_preserve_dr3, tc)
265 {
266 	dbreg_preserve(3, dbreg_preserve_mode_none);
267 }
268 
269 ATF_TC(dbregs_preserve_dr0_yield);
270 ATF_TC_HEAD(dbregs_preserve_dr0_yield, tc)
271 {
272 	atf_tc_set_md_var(tc, "descr",
273 	    "Verify that setting DR0 is preserved across ptrace(2) calls with "
274 	    "scheduler yield");
275 }
276 
277 ATF_TC_BODY(dbregs_preserve_dr0_yield, tc)
278 {
279 	dbreg_preserve(0, dbreg_preserve_mode_yield);
280 }
281 
282 ATF_TC(dbregs_preserve_dr1_yield);
283 ATF_TC_HEAD(dbregs_preserve_dr1_yield, tc)
284 {
285 	atf_tc_set_md_var(tc, "descr",
286 	    "Verify that setting DR1 is preserved across ptrace(2) calls with "
287 	    "scheduler yield");
288 }
289 
290 ATF_TC_BODY(dbregs_preserve_dr1_yield, tc)
291 {
292 	dbreg_preserve(0, dbreg_preserve_mode_yield);
293 }
294 
295 ATF_TC(dbregs_preserve_dr2_yield);
296 ATF_TC_HEAD(dbregs_preserve_dr2_yield, tc)
297 {
298 	atf_tc_set_md_var(tc, "descr",
299 	    "Verify that setting DR2 is preserved across ptrace(2) calls with "
300 	    "scheduler yield");
301 }
302 
303 ATF_TC_BODY(dbregs_preserve_dr2_yield, tc)
304 {
305 	dbreg_preserve(0, dbreg_preserve_mode_yield);
306 }
307 
308 
309 ATF_TC(dbregs_preserve_dr3_yield);
310 ATF_TC_HEAD(dbregs_preserve_dr3_yield, tc)
311 {
312 	atf_tc_set_md_var(tc, "descr",
313 	    "Verify that setting DR3 is preserved across ptrace(2) calls with "
314 	    "scheduler yield");
315 }
316 
317 ATF_TC_BODY(dbregs_preserve_dr3_yield, tc)
318 {
319 	dbreg_preserve(3, dbreg_preserve_mode_yield);
320 }
321 
322 ATF_TC(dbregs_preserve_dr0_continued);
323 ATF_TC_HEAD(dbregs_preserve_dr0_continued, tc)
324 {
325 	atf_tc_set_md_var(tc, "descr",
326 	    "Verify that setting DR0 is preserved across ptrace(2) calls and "
327 	    "with continued child");
328 }
329 
330 ATF_TC_BODY(dbregs_preserve_dr0_continued, tc)
331 {
332 	dbreg_preserve(0, dbreg_preserve_mode_continued);
333 }
334 
335 ATF_TC(dbregs_preserve_dr1_continued);
336 ATF_TC_HEAD(dbregs_preserve_dr1_continued, tc)
337 {
338 	atf_tc_set_md_var(tc, "descr",
339 	    "Verify that setting DR1 is preserved across ptrace(2) calls and "
340 	    "with continued child");
341 }
342 
343 ATF_TC_BODY(dbregs_preserve_dr1_continued, tc)
344 {
345 	dbreg_preserve(1, dbreg_preserve_mode_continued);
346 }
347 
348 ATF_TC(dbregs_preserve_dr2_continued);
349 ATF_TC_HEAD(dbregs_preserve_dr2_continued, tc)
350 {
351 	atf_tc_set_md_var(tc, "descr",
352 	    "Verify that setting DR2 is preserved across ptrace(2) calls and "
353 	    "with continued child");
354 }
355 
356 ATF_TC_BODY(dbregs_preserve_dr2_continued, tc)
357 {
358 	dbreg_preserve(2, dbreg_preserve_mode_continued);
359 }
360 
361 ATF_TC(dbregs_preserve_dr3_continued);
362 ATF_TC_HEAD(dbregs_preserve_dr3_continued, tc)
363 {
364 	atf_tc_set_md_var(tc, "descr",
365 	    "Verify that setting DR3 is preserved across ptrace(2) calls and "
366 	    "with continued child");
367 }
368 
369 ATF_TC_BODY(dbregs_preserve_dr3_continued, tc)
370 {
371 	dbreg_preserve(3, dbreg_preserve_mode_continued);
372 }
373 
374 
375 static void
376 dbregs_trap_variable(int reg, int cond, int len, bool write)
377 {
378 	const int exitval = 5;
379 	const int sigval = SIGSTOP;
380 	pid_t child, wpid;
381 #if defined(TWAIT_HAVE_STATUS)
382 	int status;
383 #endif
384 	struct dbreg r1;
385 	size_t i;
386 	volatile int watchme = 0;
387 	union u dr7;
388 
389 	struct ptrace_siginfo info;
390 	memset(&info, 0, sizeof(info));
391 
392 	dr7.raw = 0;
393 	switch (reg) {
394 	case 0:
395 		dr7.bits.global_dr0_breakpoint = 1;
396 		dr7.bits.condition_dr0 = cond;
397 		dr7.bits.len_dr0 = len;
398 	case 1:
399 		dr7.bits.global_dr1_breakpoint = 1;
400 		dr7.bits.condition_dr1 = cond;
401 		dr7.bits.len_dr1 = len;
402 	case 2:
403 		dr7.bits.global_dr2_breakpoint = 1;
404 		dr7.bits.condition_dr2 = cond;
405 		dr7.bits.len_dr2 = len;
406 	case 3:
407 		dr7.bits.global_dr3_breakpoint = 1;
408 		dr7.bits.condition_dr3 = cond;
409 		dr7.bits.len_dr3 = len;
410 		break;
411 	}
412 
413 	printf("Before forking process PID=%d\n", getpid());
414 	ATF_REQUIRE((child = fork()) != -1);
415 	if (child == 0) {
416 		printf("Before calling PT_TRACE_ME from child %d\n", getpid());
417 		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
418 
419 		printf("Before raising %s from child\n", strsignal(sigval));
420 		FORKEE_ASSERT(raise(sigval) == 0);
421 
422 		if (write)
423 			watchme = 1;
424 		else
425 			printf("watchme=%d\n", watchme);
426 
427 		printf("Before raising %s from child\n", strsignal(sigval));
428 		FORKEE_ASSERT(raise(sigval) == 0);
429 
430 		printf("Before exiting of the child process\n");
431 		_exit(exitval);
432 	}
433 	printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
434 
435 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
436 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
437 
438 	validate_status_stopped(status, sigval);
439 
440 	printf("Call GETDBREGS for the child process (r1)\n");
441 	ATF_REQUIRE(ptrace(PT_GETDBREGS, child, &r1, 0) != -1);
442 
443 	printf("State of the debug registers (r1):\n");
444 	for (i = 0; i < __arraycount(r1.dr); i++)
445 		printf("r1[%zu]=%" PRIxREGISTER "\n", i, r1.dr[i]);
446 
447 	r1.dr[reg] = (long)(intptr_t)&watchme;
448 	printf("Set DR%d (r1.dr[%d]) to new value %" PRIxREGISTER "\n",
449 	    reg, reg, r1.dr[reg]);
450 
451 	r1.dr[7] = dr7.raw;
452 	printf("Set DR7 (r1.dr[7]) to new value %" PRIxREGISTER "\n",
453 	    r1.dr[7]);
454 
455 	printf("New state of the debug registers (r1):\n");
456 	for (i = 0; i < __arraycount(r1.dr); i++)
457 		printf("r1[%zu]=%" PRIxREGISTER "\n", i, r1.dr[i]);
458 
459 	printf("Call SETDBREGS for the child process (r1)\n");
460 	ATF_REQUIRE(ptrace(PT_SETDBREGS, child, &r1, 0) != -1);
461 
462 	printf("Call CONTINUE for the child process\n");
463 	ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
464 
465 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
466 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
467 
468 	validate_status_stopped(status, SIGTRAP);
469 
470 	printf("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
471 	ATF_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
472 
473 	printf("Signal traced to lwpid=%d\n", info.psi_lwpid);
474 	printf("Signal properties: si_signo=%#x si_code=%#x si_errno=%#x\n",
475 	    info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
476 	    info.psi_siginfo.si_errno);
477 
478 	printf("Before checking siginfo_t\n");
479 	ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, SIGTRAP);
480 	ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_DBREG);
481 
482 	printf("Call CONTINUE for the child process\n");
483 	ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
484 
485 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
486 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
487 
488 	validate_status_stopped(status, sigval);
489 
490 	printf("Before resuming the child process where it left off and "
491 	    "without signal to be sent\n");
492 	ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
493 
494 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
495 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
496 
497 	validate_status_exited(status, exitval);
498 
499 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
500 	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
501 }
502 
503 ATF_TC(dbregs_dr0_trap_variable_writeonly_byte);
504 ATF_TC_HEAD(dbregs_dr0_trap_variable_writeonly_byte, tc)
505 {
506 	atf_tc_set_md_var(tc, "descr",
507 	    "Verify that setting trap with DR0 triggers SIGTRAP "
508 	    "(break on data writes only and 1 byte mode)");
509 }
510 
511 ATF_TC_BODY(dbregs_dr0_trap_variable_writeonly_byte, tc)
512 {
513 	/* 0b01 -- break on data write only */
514 	/* 0b00 -- 1 byte */
515 
516 	dbregs_trap_variable(0, 1, 0, true);
517 }
518 
519 ATF_TC(dbregs_dr1_trap_variable_writeonly_byte);
520 ATF_TC_HEAD(dbregs_dr1_trap_variable_writeonly_byte, tc)
521 {
522 	atf_tc_set_md_var(tc, "descr",
523 	    "Verify that setting trap with DR1 triggers SIGTRAP "
524 	    "(break on data writes only and 1 byte mode)");
525 }
526 
527 ATF_TC_BODY(dbregs_dr1_trap_variable_writeonly_byte, tc)
528 {
529 	/* 0b01 -- break on data write only */
530 	/* 0b00 -- 1 byte */
531 
532 	dbregs_trap_variable(1, 1, 0, true);
533 }
534 
535 ATF_TC(dbregs_dr2_trap_variable_writeonly_byte);
536 ATF_TC_HEAD(dbregs_dr2_trap_variable_writeonly_byte, tc)
537 {
538 	atf_tc_set_md_var(tc, "descr",
539 	    "Verify that setting trap with DR2 triggers SIGTRAP "
540 	    "(break on data writes only and 1 byte mode)");
541 }
542 
543 ATF_TC_BODY(dbregs_dr2_trap_variable_writeonly_byte, tc)
544 {
545 	/* 0b01 -- break on data write only */
546 	/* 0b00 -- 1 byte */
547 
548 	dbregs_trap_variable(2, 1, 0, true);
549 }
550 
551 ATF_TC(dbregs_dr3_trap_variable_writeonly_byte);
552 ATF_TC_HEAD(dbregs_dr3_trap_variable_writeonly_byte, tc)
553 {
554 	atf_tc_set_md_var(tc, "descr",
555 	    "Verify that setting trap with DR3 triggers SIGTRAP "
556 	    "(break on data writes only and 1 byte mode)");
557 }
558 
559 ATF_TC_BODY(dbregs_dr3_trap_variable_writeonly_byte, tc)
560 {
561 	/* 0b01 -- break on data write only */
562 	/* 0b00 -- 1 byte */
563 
564 	dbregs_trap_variable(3, 1, 0, true);
565 }
566 
567 ATF_TC(dbregs_dr0_trap_variable_writeonly_2bytes);
568 ATF_TC_HEAD(dbregs_dr0_trap_variable_writeonly_2bytes, tc)
569 {
570 	atf_tc_set_md_var(tc, "descr",
571 	    "Verify that setting trap with DR0 triggers SIGTRAP "
572 	    "(break on data writes only and 2 bytes mode)");
573 }
574 
575 ATF_TC_BODY(dbregs_dr0_trap_variable_writeonly_2bytes, tc)
576 {
577 	/* 0b01 -- break on data write only */
578 	/* 0b01 -- 2 bytes */
579 
580 	dbregs_trap_variable(0, 1, 1, true);
581 }
582 
583 ATF_TC(dbregs_dr1_trap_variable_writeonly_2bytes);
584 ATF_TC_HEAD(dbregs_dr1_trap_variable_writeonly_2bytes, tc)
585 {
586 	atf_tc_set_md_var(tc, "descr",
587 	    "Verify that setting trap with DR1 triggers SIGTRAP "
588 	    "(break on data writes only and 2 bytes mode)");
589 }
590 
591 ATF_TC_BODY(dbregs_dr1_trap_variable_writeonly_2bytes, tc)
592 {
593 	/* 0b01 -- break on data write only */
594 	/* 0b01 -- 2 bytes */
595 
596 	dbregs_trap_variable(1, 1, 1, true);
597 }
598 
599 ATF_TC(dbregs_dr2_trap_variable_writeonly_2bytes);
600 ATF_TC_HEAD(dbregs_dr2_trap_variable_writeonly_2bytes, tc)
601 {
602 	atf_tc_set_md_var(tc, "descr",
603 	    "Verify that setting trap with DR2 triggers SIGTRAP "
604 	    "(break on data writes only and 2 bytes mode)");
605 }
606 
607 ATF_TC_BODY(dbregs_dr2_trap_variable_writeonly_2bytes, tc)
608 {
609 	/* 0b01 -- break on data write only */
610 	/* 0b01 -- 2 bytes */
611 
612 	dbregs_trap_variable(2, 1, 1, true);
613 }
614 
615 ATF_TC(dbregs_dr3_trap_variable_writeonly_2bytes);
616 ATF_TC_HEAD(dbregs_dr3_trap_variable_writeonly_2bytes, tc)
617 {
618 	atf_tc_set_md_var(tc, "descr",
619 	    "Verify that setting trap with DR3 triggers SIGTRAP "
620 	    "(break on data writes only and 2 bytes mode)");
621 }
622 
623 ATF_TC_BODY(dbregs_dr3_trap_variable_writeonly_2bytes, tc)
624 {
625 	/* 0b01 -- break on data write only */
626 	/* 0b01 -- 2 bytes */
627 
628 	dbregs_trap_variable(3, 1, 1, true);
629 }
630 
631 ATF_TC(dbregs_dr0_trap_variable_writeonly_4bytes);
632 ATF_TC_HEAD(dbregs_dr0_trap_variable_writeonly_4bytes, tc)
633 {
634 	atf_tc_set_md_var(tc, "descr",
635 	    "Verify that setting trap with DR0 triggers SIGTRAP "
636 	    "(break on data writes only and 4 bytes mode)");
637 }
638 
639 ATF_TC_BODY(dbregs_dr0_trap_variable_writeonly_4bytes, tc)
640 {
641 	/* 0b01 -- break on data write only */
642 	/* 0b11 -- 4 bytes */
643 
644 	dbregs_trap_variable(0, 1, 3, true);
645 }
646 
647 ATF_TC(dbregs_dr1_trap_variable_writeonly_4bytes);
648 ATF_TC_HEAD(dbregs_dr1_trap_variable_writeonly_4bytes, tc)
649 {
650 	atf_tc_set_md_var(tc, "descr",
651 	    "Verify that setting trap with DR1 triggers SIGTRAP "
652 	    "(break on data writes only and 4 bytes mode)");
653 }
654 
655 ATF_TC_BODY(dbregs_dr1_trap_variable_writeonly_4bytes, tc)
656 {
657 	/* 0b01 -- break on data write only */
658 	/* 0b11 -- 4 bytes */
659 
660 	dbregs_trap_variable(1, 1, 3, true);
661 }
662 
663 ATF_TC(dbregs_dr2_trap_variable_writeonly_4bytes);
664 ATF_TC_HEAD(dbregs_dr2_trap_variable_writeonly_4bytes, tc)
665 {
666 	atf_tc_set_md_var(tc, "descr",
667 	    "Verify that setting trap with DR2 triggers SIGTRAP "
668 	    "(break on data writes only and 4 bytes mode)");
669 }
670 
671 ATF_TC_BODY(dbregs_dr2_trap_variable_writeonly_4bytes, tc)
672 {
673 	/* 0b01 -- break on data write only */
674 	/* 0b11 -- 4 bytes */
675 
676 	dbregs_trap_variable(2, 1, 3, true);
677 }
678 
679 ATF_TC(dbregs_dr3_trap_variable_writeonly_4bytes);
680 ATF_TC_HEAD(dbregs_dr3_trap_variable_writeonly_4bytes, tc)
681 {
682 	atf_tc_set_md_var(tc, "descr",
683 	    "Verify that setting trap with DR3 triggers SIGTRAP "
684 	    "(break on data writes only and 4 bytes mode)");
685 }
686 
687 ATF_TC_BODY(dbregs_dr3_trap_variable_writeonly_4bytes, tc)
688 {
689 	/* 0b01 -- break on data write only */
690 	/* 0b11 -- 4 bytes */
691 
692 	dbregs_trap_variable(3, 1, 3, true);
693 }
694 
695 ATF_TC(dbregs_dr0_trap_variable_readwrite_write_byte);
696 ATF_TC_HEAD(dbregs_dr0_trap_variable_readwrite_write_byte, tc)
697 {
698 	atf_tc_set_md_var(tc, "descr",
699 	    "Verify that setting trap with DR0 triggers SIGTRAP "
700 	    "(break on data read/write trap in read 1 byte mode)");
701 }
702 
703 ATF_TC_BODY(dbregs_dr0_trap_variable_readwrite_write_byte, tc)
704 {
705 	/* 0b11 -- break on data write&read */
706 	/* 0b00 -- 1 byte */
707 
708 	dbregs_trap_variable(0, 3, 0, true);
709 }
710 
711 ATF_TC(dbregs_dr1_trap_variable_readwrite_write_byte);
712 ATF_TC_HEAD(dbregs_dr1_trap_variable_readwrite_write_byte, tc)
713 {
714 	atf_tc_set_md_var(tc, "descr",
715 	    "Verify that setting trap with DR1 triggers SIGTRAP "
716 	    "(break on data read/write trap in read 1 byte mode)");
717 }
718 
719 ATF_TC_BODY(dbregs_dr1_trap_variable_readwrite_write_byte, tc)
720 {
721 	/* 0b11 -- break on data write&read */
722 	/* 0b00 -- 1 byte */
723 
724 	dbregs_trap_variable(1, 3, 0, true);
725 }
726 
727 ATF_TC(dbregs_dr2_trap_variable_readwrite_write_byte);
728 ATF_TC_HEAD(dbregs_dr2_trap_variable_readwrite_write_byte, tc)
729 {
730 	atf_tc_set_md_var(tc, "descr",
731 	    "Verify that setting trap with DR2 triggers SIGTRAP "
732 	    "(break on data read/write trap in read 1 byte mode)");
733 }
734 
735 ATF_TC_BODY(dbregs_dr2_trap_variable_readwrite_write_byte, tc)
736 {
737 	/* 0b11 -- break on data write&read */
738 	/* 0b00 -- 1 byte */
739 
740 	dbregs_trap_variable(2, 3, 0, true);
741 }
742 
743 ATF_TC(dbregs_dr3_trap_variable_readwrite_write_byte);
744 ATF_TC_HEAD(dbregs_dr3_trap_variable_readwrite_write_byte, tc)
745 {
746 	atf_tc_set_md_var(tc, "descr",
747 	    "Verify that setting trap with DR3 triggers SIGTRAP "
748 	    "(break on data read/write trap in read 1 byte mode)");
749 }
750 
751 ATF_TC_BODY(dbregs_dr3_trap_variable_readwrite_write_byte, tc)
752 {
753 	/* 0b11 -- break on data write&read */
754 	/* 0b00 -- 1 byte */
755 
756 	dbregs_trap_variable(3, 3, 0, true);
757 }
758 
759 ATF_TC(dbregs_dr0_trap_variable_readwrite_write_2bytes);
760 ATF_TC_HEAD(dbregs_dr0_trap_variable_readwrite_write_2bytes, tc)
761 {
762 	atf_tc_set_md_var(tc, "descr",
763 	    "Verify that setting trap with DR0 triggers SIGTRAP "
764 	    "(break on data read/write trap in read 2 bytes mode)");
765 }
766 
767 ATF_TC_BODY(dbregs_dr0_trap_variable_readwrite_write_2bytes, tc)
768 {
769 	/* 0b11 -- break on data write&read */
770 	/* 0b01 -- 2 bytes */
771 
772 	dbregs_trap_variable(0, 3, 1, true);
773 }
774 
775 ATF_TC(dbregs_dr1_trap_variable_readwrite_write_2bytes);
776 ATF_TC_HEAD(dbregs_dr1_trap_variable_readwrite_write_2bytes, tc)
777 {
778 	atf_tc_set_md_var(tc, "descr",
779 	    "Verify that setting trap with DR1 triggers SIGTRAP "
780 	    "(break on data read/write trap in read 2 bytes mode)");
781 }
782 
783 ATF_TC_BODY(dbregs_dr1_trap_variable_readwrite_write_2bytes, tc)
784 {
785 	/* 0b11 -- break on data write&read */
786 	/* 0b01 -- 2 bytes */
787 
788 	dbregs_trap_variable(1, 3, 1, true);
789 }
790 
791 ATF_TC(dbregs_dr2_trap_variable_readwrite_write_2bytes);
792 ATF_TC_HEAD(dbregs_dr2_trap_variable_readwrite_write_2bytes, tc)
793 {
794 	atf_tc_set_md_var(tc, "descr",
795 	    "Verify that setting trap with DR2 triggers SIGTRAP "
796 	    "(break on data read/write trap in read 2 bytes mode)");
797 }
798 
799 ATF_TC_BODY(dbregs_dr2_trap_variable_readwrite_write_2bytes, tc)
800 {
801 	/* 0b11 -- break on data write&read */
802 	/* 0b01 -- 2 bytes */
803 
804 	dbregs_trap_variable(2, 3, 1, true);
805 }
806 
807 ATF_TC(dbregs_dr3_trap_variable_readwrite_write_2bytes);
808 ATF_TC_HEAD(dbregs_dr3_trap_variable_readwrite_write_2bytes, tc)
809 {
810 	atf_tc_set_md_var(tc, "descr",
811 	    "Verify that setting trap with DR3 triggers SIGTRAP "
812 	    "(break on data read/write trap in read 2 bytes mode)");
813 }
814 
815 ATF_TC_BODY(dbregs_dr3_trap_variable_readwrite_write_2bytes, tc)
816 {
817 	/* 0b11 -- break on data write&read */
818 	/* 0b01 -- 2 bytes */
819 
820 	dbregs_trap_variable(3, 3, 1, true);
821 }
822 
823 ATF_TC(dbregs_dr0_trap_variable_readwrite_write_4bytes);
824 ATF_TC_HEAD(dbregs_dr0_trap_variable_readwrite_write_4bytes, tc)
825 {
826 	atf_tc_set_md_var(tc, "descr",
827 	    "Verify that setting trap with DR0 triggers SIGTRAP "
828 	    "(break on data read/write trap in read 4 bytes mode)");
829 }
830 
831 ATF_TC_BODY(dbregs_dr0_trap_variable_readwrite_write_4bytes, tc)
832 {
833 	/* 0b11 -- break on data write&read */
834 	/* 0b11 -- 4 bytes */
835 
836 	dbregs_trap_variable(0, 3, 3, true);
837 }
838 
839 ATF_TC(dbregs_dr1_trap_variable_readwrite_write_4bytes);
840 ATF_TC_HEAD(dbregs_dr1_trap_variable_readwrite_write_4bytes, tc)
841 {
842 	atf_tc_set_md_var(tc, "descr",
843 	    "Verify that setting trap with DR1 triggers SIGTRAP "
844 	    "(break on data read/write trap in read 4 bytes mode)");
845 }
846 
847 ATF_TC_BODY(dbregs_dr1_trap_variable_readwrite_write_4bytes, tc)
848 {
849 	/* 0b11 -- break on data write&read */
850 	/* 0b11 -- 4 bytes */
851 
852 	dbregs_trap_variable(1, 3, 3, true);
853 }
854 
855 ATF_TC(dbregs_dr2_trap_variable_readwrite_write_4bytes);
856 ATF_TC_HEAD(dbregs_dr2_trap_variable_readwrite_write_4bytes, tc)
857 {
858 	atf_tc_set_md_var(tc, "descr",
859 	    "Verify that setting trap with DR2 triggers SIGTRAP "
860 	    "(break on data read/write trap in read 4 bytes mode)");
861 }
862 
863 ATF_TC_BODY(dbregs_dr2_trap_variable_readwrite_write_4bytes, tc)
864 {
865 	/* 0b11 -- break on data write&read */
866 	/* 0b11 -- 4 bytes */
867 
868 	dbregs_trap_variable(2, 3, 3, true);
869 }
870 
871 ATF_TC(dbregs_dr3_trap_variable_readwrite_write_4bytes);
872 ATF_TC_HEAD(dbregs_dr3_trap_variable_readwrite_write_4bytes, tc)
873 {
874 	atf_tc_set_md_var(tc, "descr",
875 	    "Verify that setting trap with DR3 triggers SIGTRAP "
876 	    "(break on data read/write trap in read 4 bytes mode)");
877 }
878 
879 ATF_TC_BODY(dbregs_dr3_trap_variable_readwrite_write_4bytes, tc)
880 {
881 	/* 0b11 -- break on data write&read */
882 	/* 0b11 -- 4 bytes */
883 
884 	dbregs_trap_variable(3, 3, 3, true);
885 }
886 
887 ATF_TC(dbregs_dr0_trap_variable_readwrite_read_byte);
888 ATF_TC_HEAD(dbregs_dr0_trap_variable_readwrite_read_byte, tc)
889 {
890 	atf_tc_set_md_var(tc, "descr",
891 	    "Verify that setting trap with DR0 triggers SIGTRAP "
892 	    "(break on data read/write trap in write 1 byte mode)");
893 }
894 
895 ATF_TC_BODY(dbregs_dr0_trap_variable_readwrite_read_byte, tc)
896 {
897 	/* 0b11 -- break on data write&read */
898 	/* 0b00 -- 1 byte */
899 
900 	dbregs_trap_variable(0, 3, 0, false);
901 }
902 
903 ATF_TC(dbregs_dr1_trap_variable_readwrite_read_byte);
904 ATF_TC_HEAD(dbregs_dr1_trap_variable_readwrite_read_byte, tc)
905 {
906 	atf_tc_set_md_var(tc, "descr",
907 	    "Verify that setting trap with DR1 triggers SIGTRAP "
908 	    "(break on data read/write trap in write 1 byte mode)");
909 }
910 
911 ATF_TC_BODY(dbregs_dr1_trap_variable_readwrite_read_byte, tc)
912 {
913 	/* 0b11 -- break on data write&read */
914 	/* 0b00 -- 1 byte */
915 
916 	dbregs_trap_variable(1, 3, 0, false);
917 }
918 
919 ATF_TC(dbregs_dr2_trap_variable_readwrite_read_byte);
920 ATF_TC_HEAD(dbregs_dr2_trap_variable_readwrite_read_byte, tc)
921 {
922 	atf_tc_set_md_var(tc, "descr",
923 	    "Verify that setting trap with DR2 triggers SIGTRAP "
924 	    "(break on data read/write trap in write 1 byte mode)");
925 }
926 
927 ATF_TC_BODY(dbregs_dr2_trap_variable_readwrite_read_byte, tc)
928 {
929 	/* 0b11 -- break on data write&read */
930 	/* 0b00 -- 1 byte */
931 
932 	dbregs_trap_variable(2, 3, 0, false);
933 }
934 
935 ATF_TC(dbregs_dr3_trap_variable_readwrite_read_byte);
936 ATF_TC_HEAD(dbregs_dr3_trap_variable_readwrite_read_byte, tc)
937 {
938 	atf_tc_set_md_var(tc, "descr",
939 	    "Verify that setting trap with DR3 triggers SIGTRAP "
940 	    "(break on data read/write trap in write 1 byte mode)");
941 }
942 
943 ATF_TC_BODY(dbregs_dr3_trap_variable_readwrite_read_byte, tc)
944 {
945 	/* 0b11 -- break on data write&read */
946 	/* 0b00 -- 1 byte */
947 
948 	dbregs_trap_variable(3, 3, 0, false);
949 }
950 
951 ATF_TC(dbregs_dr0_trap_variable_readwrite_read_2bytes);
952 ATF_TC_HEAD(dbregs_dr0_trap_variable_readwrite_read_2bytes, tc)
953 {
954 	atf_tc_set_md_var(tc, "descr",
955 	    "Verify that setting trap with DR0 triggers SIGTRAP "
956 	    "(break on data read/write trap in write 2 bytes mode)");
957 }
958 
959 ATF_TC_BODY(dbregs_dr0_trap_variable_readwrite_read_2bytes, tc)
960 {
961 	/* 0b11 -- break on data write&read */
962 	/* 0b01 -- 2 bytes */
963 
964 	dbregs_trap_variable(0, 3, 1, false);
965 }
966 
967 ATF_TC(dbregs_dr1_trap_variable_readwrite_read_2bytes);
968 ATF_TC_HEAD(dbregs_dr1_trap_variable_readwrite_read_2bytes, tc)
969 {
970 	atf_tc_set_md_var(tc, "descr",
971 	    "Verify that setting trap with DR1 triggers SIGTRAP "
972 	    "(break on data read/write trap in write 2 bytes mode)");
973 }
974 
975 ATF_TC_BODY(dbregs_dr1_trap_variable_readwrite_read_2bytes, tc)
976 {
977 	/* 0b11 -- break on data write&read */
978 	/* 0b01 -- 2 bytes */
979 
980 	dbregs_trap_variable(1, 3, 1, false);
981 }
982 
983 ATF_TC(dbregs_dr2_trap_variable_readwrite_read_2bytes);
984 ATF_TC_HEAD(dbregs_dr2_trap_variable_readwrite_read_2bytes, tc)
985 {
986 	atf_tc_set_md_var(tc, "descr",
987 	    "Verify that setting trap with DR2 triggers SIGTRAP "
988 	    "(break on data read/write trap in write 2 bytes mode)");
989 }
990 
991 ATF_TC_BODY(dbregs_dr2_trap_variable_readwrite_read_2bytes, tc)
992 {
993 	/* 0b11 -- break on data write&read */
994 	/* 0b01 -- 2 bytes */
995 
996 	dbregs_trap_variable(2, 3, 1, false);
997 }
998 
999 ATF_TC(dbregs_dr3_trap_variable_readwrite_read_2bytes);
1000 ATF_TC_HEAD(dbregs_dr3_trap_variable_readwrite_read_2bytes, tc)
1001 {
1002 	atf_tc_set_md_var(tc, "descr",
1003 	    "Verify that setting trap with DR3 triggers SIGTRAP "
1004 	    "(break on data read/write trap in write 2 bytes mode)");
1005 }
1006 
1007 ATF_TC_BODY(dbregs_dr3_trap_variable_readwrite_read_2bytes, tc)
1008 {
1009 	/* 0b11 -- break on data write&read */
1010 	/* 0b01 -- 2 bytes */
1011 
1012 	dbregs_trap_variable(3, 3, 1, false);
1013 }
1014 
1015 ATF_TC(dbregs_dr0_trap_variable_readwrite_read_4bytes);
1016 ATF_TC_HEAD(dbregs_dr0_trap_variable_readwrite_read_4bytes, tc)
1017 {
1018 	atf_tc_set_md_var(tc, "descr",
1019 	    "Verify that setting trap with DR0 triggers SIGTRAP "
1020 	    "(break on data read/write trap in write 4 bytes mode)");
1021 }
1022 
1023 ATF_TC_BODY(dbregs_dr0_trap_variable_readwrite_read_4bytes, tc)
1024 {
1025 	/* 0b11 -- break on data write&read */
1026 	/* 0b11 -- 4 bytes */
1027 
1028 	dbregs_trap_variable(0, 3, 3, false);
1029 }
1030 
1031 ATF_TC(dbregs_dr1_trap_variable_readwrite_read_4bytes);
1032 ATF_TC_HEAD(dbregs_dr1_trap_variable_readwrite_read_4bytes, tc)
1033 {
1034 	atf_tc_set_md_var(tc, "descr",
1035 	    "Verify that setting trap with DR1 triggers SIGTRAP "
1036 	    "(break on data read/write trap in write 4 bytes mode)");
1037 }
1038 
1039 ATF_TC_BODY(dbregs_dr1_trap_variable_readwrite_read_4bytes, tc)
1040 {
1041 	/* 0b11 -- break on data write&read */
1042 	/* 0b11 -- 4 bytes */
1043 
1044 	dbregs_trap_variable(1, 3, 3, false);
1045 }
1046 
1047 ATF_TC(dbregs_dr2_trap_variable_readwrite_read_4bytes);
1048 ATF_TC_HEAD(dbregs_dr2_trap_variable_readwrite_read_4bytes, tc)
1049 {
1050 	atf_tc_set_md_var(tc, "descr",
1051 	    "Verify that setting trap with DR2 triggers SIGTRAP "
1052 	    "(break on data read/write trap in write 4 bytes mode)");
1053 }
1054 
1055 ATF_TC_BODY(dbregs_dr2_trap_variable_readwrite_read_4bytes, tc)
1056 {
1057 	/* 0b11 -- break on data write&read */
1058 	/* 0b11 -- 4 bytes */
1059 
1060 	dbregs_trap_variable(2, 3, 3, false);
1061 }
1062 
1063 ATF_TC(dbregs_dr3_trap_variable_readwrite_read_4bytes);
1064 ATF_TC_HEAD(dbregs_dr3_trap_variable_readwrite_read_4bytes, tc)
1065 {
1066 	atf_tc_set_md_var(tc, "descr",
1067 	    "Verify that setting trap with DR3 triggers SIGTRAP "
1068 	    "(break on data read/write trap in write 4 bytes mode)");
1069 }
1070 
1071 ATF_TC_BODY(dbregs_dr3_trap_variable_readwrite_read_4bytes, tc)
1072 {
1073 	/* 0b11 -- break on data write&read */
1074 	/* 0b11 -- 4 bytes */
1075 
1076 	dbregs_trap_variable(3, 3, 3, false);
1077 }
1078 
1079 #if defined(HAVE_DBREGS)
1080 ATF_TC(dbregs_dr0_trap_code);
1081 ATF_TC_HEAD(dbregs_dr0_trap_code, tc)
1082 {
1083 	atf_tc_set_md_var(tc, "descr",
1084 	    "Verify that setting trap with DR0 triggers SIGTRAP "
1085 	    "(break on code execution trap)");
1086 }
1087 
1088 ATF_TC_BODY(dbregs_dr0_trap_code, tc)
1089 {
1090 	const int exitval = 5;
1091 	const int sigval = SIGSTOP;
1092 	pid_t child, wpid;
1093 #if defined(TWAIT_HAVE_STATUS)
1094 	int status;
1095 #endif
1096 	struct dbreg r1;
1097 	size_t i;
1098 	volatile int watchme = 1;
1099 	union u dr7;
1100 
1101 	struct ptrace_siginfo info;
1102 	memset(&info, 0, sizeof(info));
1103 
1104 	dr7.raw = 0;
1105 	dr7.bits.global_dr0_breakpoint = 1;
1106 	dr7.bits.condition_dr0 = 0;	/* 0b00 -- break on code execution */
1107 	dr7.bits.len_dr0 = 0;		/* 0b00 -- 1 byte */
1108 
1109 	printf("Before forking process PID=%d\n", getpid());
1110 	ATF_REQUIRE((child = fork()) != -1);
1111 	if (child == 0) {
1112 		printf("Before calling PT_TRACE_ME from child %d\n", getpid());
1113 		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
1114 
1115 		printf("Before raising %s from child\n", strsignal(sigval));
1116 		FORKEE_ASSERT(raise(sigval) == 0);
1117 
1118 		printf("check_happy(%d)=%d\n", watchme, check_happy(watchme));
1119 
1120 		printf("Before raising %s from child\n", strsignal(sigval));
1121 		FORKEE_ASSERT(raise(sigval) == 0);
1122 
1123 		printf("Before exiting of the child process\n");
1124 		_exit(exitval);
1125 	}
1126 	printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
1127 
1128 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
1129 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1130 
1131 	validate_status_stopped(status, sigval);
1132 
1133 	printf("Call GETDBREGS for the child process (r1)\n");
1134 	ATF_REQUIRE(ptrace(PT_GETDBREGS, child, &r1, 0) != -1);
1135 
1136 	printf("State of the debug registers (r1):\n");
1137 	for (i = 0; i < __arraycount(r1.dr); i++)
1138 		printf("r1[%zu]=%" PRIxREGISTER "\n", i, r1.dr[i]);
1139 
1140 	r1.dr[0] = (long)(intptr_t)check_happy;
1141 	printf("Set DR0 (r1.dr[0]) to new value %" PRIxREGISTER "\n",
1142 	    r1.dr[0]);
1143 
1144 	r1.dr[7] = dr7.raw;
1145 	printf("Set DR7 (r1.dr[7]) to new value %" PRIxREGISTER "\n",
1146 	    r1.dr[7]);
1147 
1148 	printf("New state of the debug registers (r1):\n");
1149 	for (i = 0; i < __arraycount(r1.dr); i++)
1150 		printf("r1[%zu]=%" PRIxREGISTER "\n", i, r1.dr[i]);
1151 
1152 	printf("Call SETDBREGS for the child process (r1)\n");
1153 	ATF_REQUIRE(ptrace(PT_SETDBREGS, child, &r1, 0) != -1);
1154 
1155 	printf("Call CONTINUE for the child process\n");
1156 	ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1157 
1158 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
1159 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1160 
1161 	validate_status_stopped(status, SIGTRAP);
1162 
1163 	printf("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
1164 	ATF_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
1165 
1166 	printf("Signal traced to lwpid=%d\n", info.psi_lwpid);
1167 	printf("Signal properties: si_signo=%#x si_code=%#x si_errno=%#x\n",
1168 	    info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
1169 	    info.psi_siginfo.si_errno);
1170 
1171 	printf("Before checking siginfo_t\n");
1172 	ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, SIGTRAP);
1173 	ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_DBREG);
1174 
1175 	printf("Remove code trap from check_happy=%p\n", check_happy);
1176 	dr7.bits.global_dr0_breakpoint = 0;
1177 	r1.dr[7] = dr7.raw;
1178 	printf("Set DR7 (r1.dr[7]) to new value %" PRIxREGISTER "\n",
1179 	    r1.dr[7]);
1180 
1181 	printf("Call SETDBREGS for the child process (r1)\n");
1182 	ATF_REQUIRE(ptrace(PT_SETDBREGS, child, &r1, 0) != -1);
1183 
1184 	printf("Call CONTINUE for the child process\n");
1185 	ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1186 
1187 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
1188 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1189 
1190 	validate_status_stopped(status, sigval);
1191 
1192 	printf("Before resuming the child process where it left off and "
1193 	    "without signal to be sent\n");
1194 	ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1195 
1196 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
1197 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1198 
1199 	validate_status_exited(status, exitval);
1200 
1201 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
1202 	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
1203 }
1204 #endif
1205 
1206 #if defined(HAVE_DBREGS)
1207 ATF_TC(dbregs_dr1_trap_code);
1208 ATF_TC_HEAD(dbregs_dr1_trap_code, tc)
1209 {
1210 	atf_tc_set_md_var(tc, "descr",
1211 	    "Verify that setting trap with DR1 triggers SIGTRAP "
1212 	    "(break on code execution trap)");
1213 }
1214 
1215 ATF_TC_BODY(dbregs_dr1_trap_code, tc)
1216 {
1217 	const int exitval = 5;
1218 	const int sigval = SIGSTOP;
1219 	pid_t child, wpid;
1220 #if defined(TWAIT_HAVE_STATUS)
1221 	int status;
1222 #endif
1223 	struct dbreg r1;
1224 	size_t i;
1225 	volatile int watchme = 1;
1226 	union u dr7;
1227 
1228 	struct ptrace_siginfo info;
1229 	memset(&info, 0, sizeof(info));
1230 
1231 	dr7.raw = 0;
1232 	dr7.bits.global_dr1_breakpoint = 1;
1233 	dr7.bits.condition_dr1 = 0;	/* 0b00 -- break on code execution */
1234 	dr7.bits.len_dr1 = 0;		/* 0b00 -- 1 byte */
1235 
1236 	printf("Before forking process PID=%d\n", getpid());
1237 	ATF_REQUIRE((child = fork()) != -1);
1238 	if (child == 0) {
1239 		printf("Before calling PT_TRACE_ME from child %d\n", getpid());
1240 		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
1241 
1242 		printf("Before raising %s from child\n", strsignal(sigval));
1243 		FORKEE_ASSERT(raise(sigval) == 0);
1244 
1245 		printf("check_happy(%d)=%d\n", watchme, check_happy(watchme));
1246 
1247 		printf("Before raising %s from child\n", strsignal(sigval));
1248 		FORKEE_ASSERT(raise(sigval) == 0);
1249 
1250 		printf("Before exiting of the child process\n");
1251 		_exit(exitval);
1252 	}
1253 	printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
1254 
1255 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
1256 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1257 
1258 	validate_status_stopped(status, sigval);
1259 
1260 	printf("Call GETDBREGS for the child process (r1)\n");
1261 	ATF_REQUIRE(ptrace(PT_GETDBREGS, child, &r1, 0) != -1);
1262 
1263 	printf("State of the debug registers (r1):\n");
1264 	for (i = 0; i < __arraycount(r1.dr); i++)
1265 		printf("r1[%zu]=%" PRIxREGISTER "\n", i, r1.dr[i]);
1266 
1267 	r1.dr[1] = (long)(intptr_t)check_happy;
1268 	printf("Set DR1 (r1.dr[1]) to new value %" PRIxREGISTER "\n",
1269 	    r1.dr[1]);
1270 
1271 	r1.dr[7] = dr7.raw;
1272 	printf("Set DR7 (r1.dr[7]) to new value %" PRIxREGISTER "\n",
1273 	    r1.dr[7]);
1274 
1275 	printf("New state of the debug registers (r1):\n");
1276 	for (i = 0; i < __arraycount(r1.dr); i++)
1277 		printf("r1[%zu]=%" PRIxREGISTER "\n", i, r1.dr[i]);
1278 
1279 	printf("Call SETDBREGS for the child process (r1)\n");
1280 	ATF_REQUIRE(ptrace(PT_SETDBREGS, child, &r1, 0) != -1);
1281 
1282 	printf("Call CONTINUE for the child process\n");
1283 	ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1284 
1285 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
1286 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1287 
1288 	validate_status_stopped(status, SIGTRAP);
1289 
1290 	printf("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
1291 	ATF_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
1292 
1293 	printf("Signal traced to lwpid=%d\n", info.psi_lwpid);
1294 	printf("Signal properties: si_signo=%#x si_code=%#x si_errno=%#x\n",
1295 	    info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
1296 	    info.psi_siginfo.si_errno);
1297 
1298 	printf("Before checking siginfo_t\n");
1299 	ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, SIGTRAP);
1300 	ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_DBREG);
1301 
1302 	printf("Remove code trap from check_happy=%p\n", check_happy);
1303 	dr7.bits.global_dr1_breakpoint = 0;
1304 	r1.dr[7] = dr7.raw;
1305 	printf("Set DR7 (r1.dr[7]) to new value %" PRIxREGISTER "\n",
1306 	    r1.dr[7]);
1307 
1308 	printf("Call SETDBREGS for the child process (r1)\n");
1309 	ATF_REQUIRE(ptrace(PT_SETDBREGS, child, &r1, 0) != -1);
1310 
1311 	printf("Call CONTINUE for the child process\n");
1312 	ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1313 
1314 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
1315 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1316 
1317 	validate_status_stopped(status, sigval);
1318 
1319 	printf("Before resuming the child process where it left off and "
1320 	    "without signal to be sent\n");
1321 	ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1322 
1323 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
1324 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1325 
1326 	validate_status_exited(status, exitval);
1327 
1328 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
1329 	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
1330 }
1331 #endif
1332 
1333 #if defined(HAVE_DBREGS)
1334 ATF_TC(dbregs_dr2_trap_code);
1335 ATF_TC_HEAD(dbregs_dr2_trap_code, tc)
1336 {
1337 	atf_tc_set_md_var(tc, "descr",
1338 	    "Verify that setting trap with DR2 triggers SIGTRAP "
1339 	    "(break on code execution trap)");
1340 }
1341 
1342 ATF_TC_BODY(dbregs_dr2_trap_code, tc)
1343 {
1344 	const int exitval = 5;
1345 	const int sigval = SIGSTOP;
1346 	pid_t child, wpid;
1347 #if defined(TWAIT_HAVE_STATUS)
1348 	int status;
1349 #endif
1350 	struct dbreg r1;
1351 	size_t i;
1352 	volatile int watchme = 1;
1353 	union u dr7;
1354 
1355 	struct ptrace_siginfo info;
1356 	memset(&info, 0, sizeof(info));
1357 
1358 	dr7.raw = 0;
1359 	dr7.bits.global_dr2_breakpoint = 1;
1360 	dr7.bits.condition_dr2 = 0;	/* 0b00 -- break on code execution */
1361 	dr7.bits.len_dr2 = 0;		/* 0b00 -- 1 byte */
1362 
1363 	printf("Before forking process PID=%d\n", getpid());
1364 	ATF_REQUIRE((child = fork()) != -1);
1365 	if (child == 0) {
1366 		printf("Before calling PT_TRACE_ME from child %d\n", getpid());
1367 		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
1368 
1369 		printf("Before raising %s from child\n", strsignal(sigval));
1370 		FORKEE_ASSERT(raise(sigval) == 0);
1371 
1372 		printf("check_happy(%d)=%d\n", watchme, check_happy(watchme));
1373 
1374 		printf("Before raising %s from child\n", strsignal(sigval));
1375 		FORKEE_ASSERT(raise(sigval) == 0);
1376 
1377 		printf("Before exiting of the child process\n");
1378 		_exit(exitval);
1379 	}
1380 	printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
1381 
1382 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
1383 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1384 
1385 	validate_status_stopped(status, sigval);
1386 
1387 	printf("Call GETDBREGS for the child process (r1)\n");
1388 	ATF_REQUIRE(ptrace(PT_GETDBREGS, child, &r1, 0) != -1);
1389 
1390 	printf("State of the debug registers (r1):\n");
1391 	for (i = 0; i < __arraycount(r1.dr); i++)
1392 		printf("r1[%zu]=%" PRIxREGISTER "\n", i, r1.dr[i]);
1393 
1394 	r1.dr[2] = (long)(intptr_t)check_happy;
1395 	printf("Set DR2 (r1.dr[2]) to new value %" PRIxREGISTER "\n",
1396 	    r1.dr[2]);
1397 
1398 	r1.dr[7] = dr7.raw;
1399 	printf("Set DR7 (r1.dr[7]) to new value %" PRIxREGISTER "\n",
1400 	    r1.dr[7]);
1401 
1402 	printf("New state of the debug registers (r1):\n");
1403 	for (i = 0; i < __arraycount(r1.dr); i++)
1404 		printf("r1[%zu]=%" PRIxREGISTER "\n", i, r1.dr[i]);
1405 
1406 	printf("Call SETDBREGS for the child process (r1)\n");
1407 	ATF_REQUIRE(ptrace(PT_SETDBREGS, child, &r1, 0) != -1);
1408 
1409 	printf("Call CONTINUE for the child process\n");
1410 	ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1411 
1412 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
1413 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1414 
1415 	validate_status_stopped(status, SIGTRAP);
1416 
1417 	printf("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
1418 	ATF_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
1419 
1420 	printf("Signal traced to lwpid=%d\n", info.psi_lwpid);
1421 	printf("Signal properties: si_signo=%#x si_code=%#x si_errno=%#x\n",
1422 	    info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
1423 	    info.psi_siginfo.si_errno);
1424 
1425 	printf("Before checking siginfo_t\n");
1426 	ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, SIGTRAP);
1427 	ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_DBREG);
1428 
1429 	printf("Remove code trap from check_happy=%p\n", check_happy);
1430 	dr7.bits.global_dr2_breakpoint = 0;
1431 	r1.dr[7] = dr7.raw;
1432 	printf("Set DR7 (r1.dr[7]) to new value %" PRIxREGISTER "\n",
1433 	    r1.dr[7]);
1434 
1435 	printf("Call SETDBREGS for the child process (r1)\n");
1436 	ATF_REQUIRE(ptrace(PT_SETDBREGS, child, &r1, 0) != -1);
1437 
1438 	printf("Call CONTINUE for the child process\n");
1439 	ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1440 
1441 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
1442 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1443 
1444 	validate_status_stopped(status, sigval);
1445 
1446 	printf("Before resuming the child process where it left off and "
1447 	    "without signal to be sent\n");
1448 	ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1449 
1450 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
1451 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1452 
1453 	validate_status_exited(status, exitval);
1454 
1455 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
1456 	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
1457 }
1458 #endif
1459 
1460 #if defined(HAVE_DBREGS)
1461 ATF_TC(dbregs_dr3_trap_code);
1462 ATF_TC_HEAD(dbregs_dr3_trap_code, tc)
1463 {
1464 	atf_tc_set_md_var(tc, "descr",
1465 	    "Verify that setting trap with DR3 triggers SIGTRAP "
1466 	    "(break on code execution trap)");
1467 }
1468 
1469 ATF_TC_BODY(dbregs_dr3_trap_code, tc)
1470 {
1471 	const int exitval = 5;
1472 	const int sigval = SIGSTOP;
1473 	pid_t child, wpid;
1474 #if defined(TWAIT_HAVE_STATUS)
1475 	int status;
1476 #endif
1477 	struct dbreg r1;
1478 	size_t i;
1479 	volatile int watchme = 1;
1480 	union u dr7;
1481 
1482 	struct ptrace_siginfo info;
1483 	memset(&info, 0, sizeof(info));
1484 
1485 	dr7.raw = 0;
1486 	dr7.bits.global_dr3_breakpoint = 1;
1487 	dr7.bits.condition_dr3 = 0;	/* 0b00 -- break on code execution */
1488 	dr7.bits.len_dr3 = 0;		/* 0b00 -- 1 byte */
1489 
1490 	printf("Before forking process PID=%d\n", getpid());
1491 	ATF_REQUIRE((child = fork()) != -1);
1492 	if (child == 0) {
1493 		printf("Before calling PT_TRACE_ME from child %d\n", getpid());
1494 		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
1495 
1496 		printf("Before raising %s from child\n", strsignal(sigval));
1497 		FORKEE_ASSERT(raise(sigval) == 0);
1498 
1499 		printf("check_happy(%d)=%d\n", watchme, check_happy(watchme));
1500 
1501 		printf("Before raising %s from child\n", strsignal(sigval));
1502 		FORKEE_ASSERT(raise(sigval) == 0);
1503 
1504 		printf("Before exiting of the child process\n");
1505 		_exit(exitval);
1506 	}
1507 	printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
1508 
1509 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
1510 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1511 
1512 	validate_status_stopped(status, sigval);
1513 
1514 	printf("Call GETDBREGS for the child process (r1)\n");
1515 	ATF_REQUIRE(ptrace(PT_GETDBREGS, child, &r1, 0) != -1);
1516 
1517 	printf("State of the debug registers (r1):\n");
1518 	for (i = 0; i < __arraycount(r1.dr); i++)
1519 		printf("r1[%zu]=%" PRIxREGISTER "\n", i, r1.dr[i]);
1520 
1521 	r1.dr[3] = (long)(intptr_t)check_happy;
1522 	printf("Set DR3 (r1.dr[3]) to new value %" PRIxREGISTER "\n",
1523 	    r1.dr[3]);
1524 
1525 	r1.dr[7] = dr7.raw;
1526 	printf("Set DR7 (r1.dr[7]) to new value %" PRIxREGISTER "\n",
1527 	    r1.dr[7]);
1528 
1529 	printf("New state of the debug registers (r1):\n");
1530 	for (i = 0; i < __arraycount(r1.dr); i++)
1531 		printf("r1[%zu]=%" PRIxREGISTER "\n", i, r1.dr[i]);
1532 
1533 	printf("Call SETDBREGS for the child process (r1)\n");
1534 	ATF_REQUIRE(ptrace(PT_SETDBREGS, child, &r1, 0) != -1);
1535 
1536 	printf("Call CONTINUE for the child process\n");
1537 	ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1538 
1539 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
1540 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1541 
1542 	validate_status_stopped(status, SIGTRAP);
1543 
1544 	printf("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
1545 	ATF_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
1546 
1547 	printf("Signal traced to lwpid=%d\n", info.psi_lwpid);
1548 	printf("Signal properties: si_signo=%#x si_code=%#x si_errno=%#x\n",
1549 	    info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
1550 	    info.psi_siginfo.si_errno);
1551 
1552 	printf("Before checking siginfo_t\n");
1553 	ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, SIGTRAP);
1554 	ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_DBREG);
1555 
1556 	printf("Remove code trap from check_happy=%p\n", check_happy);
1557 	dr7.bits.global_dr3_breakpoint = 0;
1558 	r1.dr[7] = dr7.raw;
1559 	printf("Set DR7 (r1.dr[7]) to new value %" PRIxREGISTER "\n",
1560 	    r1.dr[7]);
1561 
1562 	printf("Call SETDBREGS for the child process (r1)\n");
1563 	ATF_REQUIRE(ptrace(PT_SETDBREGS, child, &r1, 0) != -1);
1564 
1565 	printf("Call CONTINUE for the child process\n");
1566 	ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1567 
1568 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
1569 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1570 
1571 	validate_status_stopped(status, sigval);
1572 
1573 	printf("Before resuming the child process where it left off and "
1574 	    "without signal to be sent\n");
1575 	ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1576 
1577 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
1578 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1579 
1580 	validate_status_exited(status, exitval);
1581 
1582 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
1583 	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
1584 }
1585 #endif
1586 
1587 volatile lwpid_t x86_the_lwp_id = 0;
1588 
1589 static void __used
1590 x86_lwp_main_func(void *arg)
1591 {
1592 	x86_the_lwp_id = _lwp_self();
1593 	_lwp_exit();
1594 }
1595 
1596 static void
1597 dbregs_dont_inherit_lwp(int reg)
1598 {
1599 	const int exitval = 5;
1600 	const int sigval = SIGSTOP;
1601 	pid_t child, wpid;
1602 #if defined(TWAIT_HAVE_STATUS)
1603 	int status;
1604 #endif
1605 	ptrace_state_t state;
1606 	const int slen = sizeof(state);
1607 	ptrace_event_t event;
1608 	const int elen = sizeof(event);
1609 	ucontext_t uc;
1610 	lwpid_t lid;
1611 	static const size_t ssize = 16*1024;
1612 	void *stack;
1613 	size_t i;
1614 	struct dbreg r1;
1615 	struct dbreg r2;
1616 
1617 	printf("Before forking process PID=%d\n", getpid());
1618 	ATF_REQUIRE((child = fork()) != -1);
1619 	if (child == 0) {
1620 		printf("Before calling PT_TRACE_ME from child %d\n", getpid());
1621 		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
1622 
1623 		printf("Before raising %s from child\n", strsignal(sigval));
1624 		FORKEE_ASSERT(raise(sigval) == 0);
1625 
1626 		printf("Before allocating memory for stack in child\n");
1627 		FORKEE_ASSERT((stack = malloc(ssize)) != NULL);
1628 
1629 		printf("Before making context for new lwp in child\n");
1630 		_lwp_makecontext(&uc, x86_lwp_main_func, NULL, NULL, stack,
1631 		    ssize);
1632 
1633 		printf("Before creating new in child\n");
1634 		FORKEE_ASSERT(_lwp_create(&uc, 0, &lid) == 0);
1635 
1636 		printf("Before waiting for lwp %d to exit\n", lid);
1637 		FORKEE_ASSERT(_lwp_wait(lid, NULL) == 0);
1638 
1639 		printf("Before verifying that reported %d and running lid %d "
1640 		    "are the same\n", lid, x86_the_lwp_id);
1641 		FORKEE_ASSERT_EQ(lid, x86_the_lwp_id);
1642 
1643 		printf("Before exiting of the child process\n");
1644 		_exit(exitval);
1645 	}
1646 	printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
1647 
1648 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
1649 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1650 
1651 	validate_status_stopped(status, sigval);
1652 
1653 	printf("Set empty EVENT_MASK for the child %d\n", child);
1654 	event.pe_set_event = PTRACE_LWP_CREATE;
1655 	ATF_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1);
1656 
1657 	printf("Call GETDBREGS for the child process (r1)\n");
1658 	ATF_REQUIRE(ptrace(PT_GETDBREGS, child, &r1, 0) != -1);
1659 
1660 	printf("State of the debug registers (r1):\n");
1661 	for (i = 0; i < __arraycount(r1.dr); i++)
1662 		printf("r1[%zu]=%" PRIxREGISTER "\n", i, r1.dr[i]);
1663 
1664 	r1.dr[reg] = (long)(intptr_t)check_happy;
1665 	printf("Set DR%d (r1.dr[%d]) to new value %" PRIxREGISTER "\n",
1666 	    reg, reg, r1.dr[0]);
1667 
1668 	printf("New state of the debug registers (r1):\n");
1669 	for (i = 0; i < __arraycount(r1.dr); i++)
1670 		printf("r1[%zu]=%" PRIxREGISTER "\n", i, r1.dr[i]);
1671 
1672 	printf("Call SETDBREGS for the child process (r1)\n");
1673 	ATF_REQUIRE(ptrace(PT_SETDBREGS, child, &r1, 0) != -1);
1674 
1675 	printf("Before resuming the child process where it left off and "
1676 	    "without signal to be sent\n");
1677 	ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1678 
1679 	printf("Before calling %s() for the child - expected stopped "
1680 	    "SIGTRAP\n", TWAIT_FNAME);
1681 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1682 
1683 	validate_status_stopped(status, SIGTRAP);
1684 
1685 	ATF_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1);
1686 
1687 	ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_LWP_CREATE);
1688 
1689 	lid = state.pe_lwp;
1690 	printf("Reported PTRACE_LWP_CREATE event with lid %d\n", lid);
1691 
1692 	printf("Call GETDBREGS for the child process new lwp (r2)\n");
1693 	ATF_REQUIRE(ptrace(PT_GETDBREGS, child, &r2, lid) != -1);
1694 
1695 	printf("State of the debug registers (r2):\n");
1696 	for (i = 0; i < __arraycount(r2.dr); i++)
1697 		printf("r2[%zu]=%" PRIxREGISTER "\n", i, r2.dr[i]);
1698 
1699 	printf("Assert that (r1) and (r2) are not the same\n");
1700 	ATF_REQUIRE(memcmp(&r1, &r2, sizeof(r1)) != 0);
1701 
1702 	printf("Before resuming the child process where it left off and "
1703 	    "without signal to be sent\n");
1704 	ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1705 
1706 	printf("Before calling %s() for the child - expected exited\n",
1707 	    TWAIT_FNAME);
1708 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1709 
1710 	validate_status_exited(status, exitval);
1711 
1712 	printf("Before calling %s() for the child - expected no process\n",
1713 	    TWAIT_FNAME);
1714 	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
1715 }
1716 
1717 ATF_TC(dbregs_dr0_dont_inherit_lwp);
1718 ATF_TC_HEAD(dbregs_dr0_dont_inherit_lwp, tc)
1719 {
1720 	atf_tc_set_md_var(tc, "descr",
1721 	    "Verify that 1 LWP creation is intercepted by ptrace(2) with "
1722 	    "EVENT_MASK set to PTRACE_LWP_CREATE and Debug Register 0 from "
1723 	    "the forker thread is not inherited");
1724 }
1725 
1726 ATF_TC_BODY(dbregs_dr0_dont_inherit_lwp, tc)
1727 {
1728 	dbregs_dont_inherit_lwp(0);
1729 }
1730 
1731 ATF_TC(dbregs_dr1_dont_inherit_lwp);
1732 ATF_TC_HEAD(dbregs_dr1_dont_inherit_lwp, tc)
1733 {
1734 	atf_tc_set_md_var(tc, "descr",
1735 	    "Verify that 1 LWP creation is intercepted by ptrace(2) with "
1736 	    "EVENT_MASK set to PTRACE_LWP_CREATE and Debug Register 1 from "
1737 	    "the forker thread is not inherited");
1738 }
1739 
1740 ATF_TC_BODY(dbregs_dr1_dont_inherit_lwp, tc)
1741 {
1742 	dbregs_dont_inherit_lwp(1);
1743 }
1744 
1745 ATF_TC(dbregs_dr2_dont_inherit_lwp);
1746 ATF_TC_HEAD(dbregs_dr2_dont_inherit_lwp, tc)
1747 {
1748 	atf_tc_set_md_var(tc, "descr",
1749 	    "Verify that 1 LWP creation is intercepted by ptrace(2) with "
1750 	    "EVENT_MASK set to PTRACE_LWP_CREATE and Debug Register 2 from "
1751 	    "the forker thread is not inherited");
1752 }
1753 
1754 ATF_TC_BODY(dbregs_dr2_dont_inherit_lwp, tc)
1755 {
1756 	dbregs_dont_inherit_lwp(2);
1757 }
1758 
1759 ATF_TC(dbregs_dr3_dont_inherit_lwp);
1760 ATF_TC_HEAD(dbregs_dr3_dont_inherit_lwp, tc)
1761 {
1762 	atf_tc_set_md_var(tc, "descr",
1763 	    "Verify that 1 LWP creation is intercepted by ptrace(2) with "
1764 	    "EVENT_MASK set to PTRACE_LWP_CREATE and Debug Register 3 from "
1765 	    "the forker thread is not inherited");
1766 }
1767 
1768 ATF_TC_BODY(dbregs_dr3_dont_inherit_lwp, tc)
1769 {
1770 	dbregs_dont_inherit_lwp(3);
1771 }
1772 
1773 static void
1774 dbregs_dont_inherit_execve(int reg)
1775 {
1776 	const int sigval = SIGTRAP;
1777 	pid_t child, wpid;
1778 #if defined(TWAIT_HAVE_STATUS)
1779 	int status;
1780 #endif
1781 	size_t i;
1782 	struct dbreg r1;
1783 	struct dbreg r2;
1784 
1785 	struct ptrace_siginfo info;
1786 	memset(&info, 0, sizeof(info));
1787 
1788 	printf("Before forking process PID=%d\n", getpid());
1789 	ATF_REQUIRE((child = fork()) != -1);
1790 	if (child == 0) {
1791 		printf("Before calling PT_TRACE_ME from child %d\n", getpid());
1792 		FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
1793 
1794 		printf("Before raising %s from child\n", strsignal(sigval));
1795 		FORKEE_ASSERT(raise(sigval) == 0);
1796 
1797 		printf("Before calling execve(2) from child\n");
1798 		execlp("/bin/echo", "/bin/echo", NULL);
1799 
1800 		FORKEE_ASSERT(0 && "Not reached");
1801 	}
1802 	printf("Parent process PID=%d, child's PID=%d\n", getpid(), child);
1803 
1804 	printf("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 	printf("Call GETDBREGS for the child process (r1)\n");
1810 	ATF_REQUIRE(ptrace(PT_GETDBREGS, child, &r1, 0) != -1);
1811 
1812 	printf("State of the debug registers (r1):\n");
1813 	for (i = 0; i < __arraycount(r1.dr); i++)
1814 		printf("r1[%zu]=%" PRIxREGISTER "\n", i, r1.dr[i]);
1815 
1816 	r1.dr[reg] = (long)(intptr_t)check_happy;
1817 	printf("Set DR%d (r1.dr[%d]) to new value %" PRIxREGISTER "\n",
1818 	    reg, reg, r1.dr[reg]);
1819 
1820 	printf("New state of the debug registers (r1):\n");
1821 	for (i = 0; i < __arraycount(r1.dr); i++)
1822 		printf("r1[%zu]=%" PRIxREGISTER "\n", i, r1.dr[i]);
1823 
1824 	printf("Call SETDBREGS for the child process (r1)\n");
1825 	ATF_REQUIRE(ptrace(PT_SETDBREGS, child, &r1, 0) != -1);
1826 
1827 	printf("Before resuming the child process where it left off and "
1828 	    "without signal to be sent\n");
1829 	ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1830 
1831 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
1832 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1833 
1834 	validate_status_stopped(status, sigval);
1835 
1836 	printf("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
1837 	ATF_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
1838 
1839 	printf("Signal traced to lwpid=%d\n", info.psi_lwpid);
1840 	printf("Signal properties: si_signo=%#x si_code=%#x si_errno=%#x\n",
1841 	    info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
1842 	    info.psi_siginfo.si_errno);
1843 
1844 	ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sigval);
1845 	ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_EXEC);
1846 
1847 	printf("Call GETDBREGS for the child process after execve(2)\n");
1848 	ATF_REQUIRE(ptrace(PT_GETDBREGS, child, &r2, 0) != -1);
1849 
1850 	printf("State of the debug registers (r2):\n");
1851 	for (i = 0; i < __arraycount(r2.dr); i++)
1852 		printf("r2[%zu]=%" PRIxREGISTER "\n", i, r2.dr[i]);
1853 
1854 	printf("Assert that (r1) and (r2) are not the same\n");
1855 	ATF_REQUIRE(memcmp(&r1, &r2, sizeof(r1)) != 0);
1856 
1857 	printf("Before resuming the child process where it left off and "
1858 	    "without signal to be sent\n");
1859 	ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
1860 
1861 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
1862 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
1863 
1864 	printf("Before calling %s() for the child\n", TWAIT_FNAME);
1865 	TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
1866 }
1867 
1868 ATF_TC(dbregs_dr0_dont_inherit_execve);
1869 ATF_TC_HEAD(dbregs_dr0_dont_inherit_execve, tc)
1870 {
1871 	atf_tc_set_md_var(tc, "descr",
1872 	    "Verify that execve(2) is intercepted by tracer and Debug "
1873 	    "Register 0 is reset");
1874 }
1875 
1876 ATF_TC_BODY(dbregs_dr0_dont_inherit_execve, tc)
1877 {
1878 	dbregs_dont_inherit_execve(0);
1879 }
1880 
1881 ATF_TC(dbregs_dr1_dont_inherit_execve);
1882 ATF_TC_HEAD(dbregs_dr1_dont_inherit_execve, tc)
1883 {
1884 	atf_tc_set_md_var(tc, "descr",
1885 	    "Verify that execve(2) is intercepted by tracer and Debug "
1886 	    "Register 1 is reset");
1887 }
1888 
1889 ATF_TC_BODY(dbregs_dr1_dont_inherit_execve, tc)
1890 {
1891 	dbregs_dont_inherit_execve(1);
1892 }
1893 
1894 ATF_TC(dbregs_dr2_dont_inherit_execve);
1895 ATF_TC_HEAD(dbregs_dr2_dont_inherit_execve, tc)
1896 {
1897 	atf_tc_set_md_var(tc, "descr",
1898 	    "Verify that execve(2) is intercepted by tracer and Debug "
1899 	    "Register 2 is reset");
1900 }
1901 
1902 ATF_TC_BODY(dbregs_dr2_dont_inherit_execve, tc)
1903 {
1904 	dbregs_dont_inherit_execve(2);
1905 }
1906 
1907 ATF_TC(dbregs_dr3_dont_inherit_execve);
1908 ATF_TC_HEAD(dbregs_dr3_dont_inherit_execve, tc)
1909 {
1910 	atf_tc_set_md_var(tc, "descr",
1911 	    "Verify that execve(2) is intercepted by tracer and Debug "
1912 	    "Register 3 is reset");
1913 }
1914 
1915 ATF_TC_BODY(dbregs_dr3_dont_inherit_execve, tc)
1916 {
1917 	dbregs_dont_inherit_execve(3);
1918 }
1919 #define ATF_TP_ADD_TCS_PTRACE_WAIT_X86() \
1920 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_print); \
1921 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_preserve_dr0); \
1922 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_preserve_dr1); \
1923 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_preserve_dr2); \
1924 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_preserve_dr3); \
1925 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_preserve_dr0_yield); \
1926 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_preserve_dr1_yield); \
1927 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_preserve_dr2_yield); \
1928 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_preserve_dr3_yield); \
1929 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_preserve_dr0_continued); \
1930 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_preserve_dr1_continued); \
1931 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_preserve_dr2_continued); \
1932 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_preserve_dr3_continued); \
1933 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr0_trap_variable_writeonly_byte); \
1934 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr1_trap_variable_writeonly_byte); \
1935 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr2_trap_variable_writeonly_byte); \
1936 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr3_trap_variable_writeonly_byte); \
1937 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr0_trap_variable_writeonly_2bytes); \
1938 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr1_trap_variable_writeonly_2bytes); \
1939 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr2_trap_variable_writeonly_2bytes); \
1940 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr3_trap_variable_writeonly_2bytes); \
1941 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr0_trap_variable_writeonly_4bytes); \
1942 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr1_trap_variable_writeonly_4bytes); \
1943 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr2_trap_variable_writeonly_4bytes); \
1944 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr3_trap_variable_writeonly_4bytes); \
1945 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr0_trap_variable_readwrite_write_byte); \
1946 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr1_trap_variable_readwrite_write_byte); \
1947 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr2_trap_variable_readwrite_write_byte); \
1948 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr3_trap_variable_readwrite_write_byte); \
1949 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr0_trap_variable_readwrite_write_2bytes); \
1950 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr1_trap_variable_readwrite_write_2bytes); \
1951 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr2_trap_variable_readwrite_write_2bytes); \
1952 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr3_trap_variable_readwrite_write_2bytes); \
1953 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr0_trap_variable_readwrite_write_4bytes); \
1954 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr1_trap_variable_readwrite_write_4bytes); \
1955 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr2_trap_variable_readwrite_write_4bytes); \
1956 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr3_trap_variable_readwrite_write_4bytes); \
1957 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr0_trap_variable_readwrite_read_byte); \
1958 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr1_trap_variable_readwrite_read_byte); \
1959 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr2_trap_variable_readwrite_read_byte); \
1960 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr3_trap_variable_readwrite_read_byte); \
1961 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr0_trap_variable_readwrite_read_2bytes); \
1962 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr1_trap_variable_readwrite_read_2bytes); \
1963 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr2_trap_variable_readwrite_read_2bytes); \
1964 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr3_trap_variable_readwrite_read_2bytes); \
1965 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr0_trap_variable_readwrite_read_4bytes); \
1966 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr1_trap_variable_readwrite_read_4bytes); \
1967 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr2_trap_variable_readwrite_read_4bytes); \
1968 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr3_trap_variable_readwrite_read_4bytes); \
1969 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr0_trap_code); \
1970 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr1_trap_code); \
1971 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr2_trap_code); \
1972 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr3_trap_code); \
1973 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr0_dont_inherit_lwp); \
1974 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr1_dont_inherit_lwp); \
1975 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr2_dont_inherit_lwp); \
1976 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr3_dont_inherit_lwp); \
1977 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr0_dont_inherit_execve); \
1978 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr1_dont_inherit_execve); \
1979 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr2_dont_inherit_execve); \
1980 	ATF_TP_ADD_TC_HAVE_DBREGS(tp, dbregs_dr3_dont_inherit_execve);
1981 #else
1982 #define ATF_TP_ADD_TCS_PTRACE_WAIT_X86()
1983 #endif
1984