t_ptrace_clone_wait.h revision 1.3 1 1.3 kamil /* $NetBSD: t_ptrace_clone_wait.h,v 1.3 2020/05/11 21:18:11 kamil Exp $ */
2 1.1 kamil
3 1.1 kamil /*-
4 1.2 kamil * Copyright (c) 2016, 2017, 2018, 2019, 2020 The NetBSD Foundation, Inc.
5 1.1 kamil * All rights reserved.
6 1.1 kamil *
7 1.1 kamil * Redistribution and use in source and binary forms, with or without
8 1.1 kamil * modification, are permitted provided that the following conditions
9 1.1 kamil * are met:
10 1.1 kamil * 1. Redistributions of source code must retain the above copyright
11 1.1 kamil * notice, this list of conditions and the following disclaimer.
12 1.1 kamil * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 kamil * notice, this list of conditions and the following disclaimer in the
14 1.1 kamil * documentation and/or other materials provided with the distribution.
15 1.1 kamil *
16 1.1 kamil * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17 1.1 kamil * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18 1.1 kamil * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 1.1 kamil * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20 1.1 kamil * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 1.1 kamil * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 1.1 kamil * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 1.1 kamil * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 1.1 kamil * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 1.1 kamil * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 1.1 kamil * POSSIBILITY OF SUCH DAMAGE.
27 1.1 kamil */
28 1.1 kamil
29 1.1 kamil
30 1.1 kamil static void
31 1.1 kamil clone_body(int flags, bool trackfork, bool trackvfork,
32 1.1 kamil bool trackvforkdone)
33 1.1 kamil {
34 1.1 kamil const int exitval = 5;
35 1.1 kamil const int exitval2 = 15;
36 1.1 kamil const int sigval = SIGSTOP;
37 1.1 kamil pid_t child, child2 = 0, wpid;
38 1.1 kamil #if defined(TWAIT_HAVE_STATUS)
39 1.1 kamil int status;
40 1.1 kamil #endif
41 1.1 kamil ptrace_state_t state;
42 1.1 kamil const int slen = sizeof(state);
43 1.1 kamil ptrace_event_t event;
44 1.1 kamil const int elen = sizeof(event);
45 1.1 kamil
46 1.1 kamil const size_t stack_size = 1024 * 1024;
47 1.1 kamil void *stack, *stack_base;
48 1.1 kamil
49 1.1 kamil stack = malloc(stack_size);
50 1.1 kamil ATF_REQUIRE(stack != NULL);
51 1.1 kamil
52 1.1 kamil #ifdef __MACHINE_STACK_GROWS_UP
53 1.1 kamil stack_base = stack;
54 1.1 kamil #else
55 1.1 kamil stack_base = (char *)stack + stack_size;
56 1.1 kamil #endif
57 1.1 kamil
58 1.1 kamil DPRINTF("Before forking process PID=%d\n", getpid());
59 1.1 kamil SYSCALL_REQUIRE((child = fork()) != -1);
60 1.1 kamil if (child == 0) {
61 1.1 kamil DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
62 1.1 kamil FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
63 1.1 kamil
64 1.1 kamil DPRINTF("Before raising %s from child\n", strsignal(sigval));
65 1.1 kamil FORKEE_ASSERT(raise(sigval) == 0);
66 1.1 kamil
67 1.1 kamil SYSCALL_REQUIRE((child2 = __clone(clone_func, stack_base,
68 1.1 kamil flags|SIGCHLD, (void *)(intptr_t)exitval2)) != -1);
69 1.1 kamil
70 1.1 kamil DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(),
71 1.1 kamil child2);
72 1.1 kamil
73 1.1 kamil // XXX WALLSIG?
74 1.1 kamil FORKEE_REQUIRE_SUCCESS
75 1.1 kamil (wpid = TWAIT_GENERIC(child2, &status, WALLSIG), child2);
76 1.1 kamil
77 1.1 kamil forkee_status_exited(status, exitval2);
78 1.1 kamil
79 1.1 kamil DPRINTF("Before exiting of the child process\n");
80 1.1 kamil _exit(exitval);
81 1.1 kamil }
82 1.1 kamil DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
83 1.1 kamil
84 1.1 kamil DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
85 1.1 kamil TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
86 1.1 kamil
87 1.1 kamil validate_status_stopped(status, sigval);
88 1.1 kamil
89 1.1 kamil DPRINTF("Set 0%s%s%s in EVENT_MASK for the child %d\n",
90 1.1 kamil trackfork ? "|PTRACE_FORK" : "",
91 1.1 kamil trackvfork ? "|PTRACE_VFORK" : "",
92 1.1 kamil trackvforkdone ? "|PTRACE_VFORK_DONE" : "", child);
93 1.1 kamil event.pe_set_event = 0;
94 1.1 kamil if (trackfork)
95 1.1 kamil event.pe_set_event |= PTRACE_FORK;
96 1.1 kamil if (trackvfork)
97 1.1 kamil event.pe_set_event |= PTRACE_VFORK;
98 1.1 kamil if (trackvforkdone)
99 1.1 kamil event.pe_set_event |= PTRACE_VFORK_DONE;
100 1.1 kamil SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1);
101 1.1 kamil
102 1.1 kamil DPRINTF("Before resuming the child process where it left off and "
103 1.1 kamil "without signal to be sent\n");
104 1.1 kamil SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
105 1.1 kamil
106 1.1 kamil #if defined(TWAIT_HAVE_PID)
107 1.1 kamil if ((trackfork && !(flags & CLONE_VFORK)) ||
108 1.1 kamil (trackvfork && (flags & CLONE_VFORK))) {
109 1.1 kamil DPRINTF("Before calling %s() for the child %d\n", TWAIT_FNAME,
110 1.1 kamil child);
111 1.1 kamil TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0),
112 1.1 kamil child);
113 1.1 kamil
114 1.1 kamil validate_status_stopped(status, SIGTRAP);
115 1.1 kamil
116 1.1 kamil SYSCALL_REQUIRE(
117 1.1 kamil ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1);
118 1.1 kamil if (trackfork && !(flags & CLONE_VFORK)) {
119 1.1 kamil ATF_REQUIRE_EQ(state.pe_report_event & PTRACE_FORK,
120 1.1 kamil PTRACE_FORK);
121 1.1 kamil }
122 1.1 kamil if (trackvfork && (flags & CLONE_VFORK)) {
123 1.1 kamil ATF_REQUIRE_EQ(state.pe_report_event & PTRACE_VFORK,
124 1.1 kamil PTRACE_VFORK);
125 1.1 kamil }
126 1.1 kamil
127 1.1 kamil child2 = state.pe_other_pid;
128 1.1 kamil DPRINTF("Reported ptrace event with forkee %d\n", child2);
129 1.1 kamil
130 1.1 kamil DPRINTF("Before calling %s() for the forkee %d of the child "
131 1.1 kamil "%d\n", TWAIT_FNAME, child2, child);
132 1.1 kamil TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child2, &status, 0),
133 1.1 kamil child2);
134 1.1 kamil
135 1.1 kamil validate_status_stopped(status, SIGTRAP);
136 1.1 kamil
137 1.1 kamil SYSCALL_REQUIRE(
138 1.1 kamil ptrace(PT_GET_PROCESS_STATE, child2, &state, slen) != -1);
139 1.1 kamil if (trackfork && !(flags & CLONE_VFORK)) {
140 1.1 kamil ATF_REQUIRE_EQ(state.pe_report_event & PTRACE_FORK,
141 1.1 kamil PTRACE_FORK);
142 1.1 kamil }
143 1.1 kamil if (trackvfork && (flags & CLONE_VFORK)) {
144 1.1 kamil ATF_REQUIRE_EQ(state.pe_report_event & PTRACE_VFORK,
145 1.1 kamil PTRACE_VFORK);
146 1.1 kamil }
147 1.1 kamil
148 1.1 kamil ATF_REQUIRE_EQ(state.pe_other_pid, child);
149 1.1 kamil
150 1.1 kamil DPRINTF("Before resuming the forkee process where it left off "
151 1.1 kamil "and without signal to be sent\n");
152 1.1 kamil SYSCALL_REQUIRE(
153 1.1 kamil ptrace(PT_CONTINUE, child2, (void *)1, 0) != -1);
154 1.1 kamil
155 1.1 kamil DPRINTF("Before resuming the child process where it left off "
156 1.1 kamil "and without signal to be sent\n");
157 1.1 kamil SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
158 1.1 kamil }
159 1.1 kamil #endif
160 1.1 kamil
161 1.1 kamil if (trackvforkdone && (flags & CLONE_VFORK)) {
162 1.1 kamil DPRINTF("Before calling %s() for the child %d\n", TWAIT_FNAME,
163 1.1 kamil child);
164 1.1 kamil TWAIT_REQUIRE_SUCCESS(
165 1.1 kamil wpid = TWAIT_GENERIC(child, &status, 0), child);
166 1.1 kamil
167 1.1 kamil validate_status_stopped(status, SIGTRAP);
168 1.1 kamil
169 1.1 kamil SYSCALL_REQUIRE(
170 1.1 kamil ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1);
171 1.1 kamil ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_VFORK_DONE);
172 1.1 kamil
173 1.1 kamil child2 = state.pe_other_pid;
174 1.1 kamil DPRINTF("Reported PTRACE_VFORK_DONE event with forkee %d\n",
175 1.1 kamil child2);
176 1.1 kamil
177 1.1 kamil DPRINTF("Before resuming the child process where it left off "
178 1.1 kamil "and without signal to be sent\n");
179 1.1 kamil SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
180 1.1 kamil }
181 1.1 kamil
182 1.1 kamil #if defined(TWAIT_HAVE_PID)
183 1.1 kamil if ((trackfork && !(flags & CLONE_VFORK)) ||
184 1.1 kamil (trackvfork && (flags & CLONE_VFORK))) {
185 1.1 kamil DPRINTF("Before calling %s() for the forkee - expected exited"
186 1.1 kamil "\n", TWAIT_FNAME);
187 1.1 kamil TWAIT_REQUIRE_SUCCESS(
188 1.1 kamil wpid = TWAIT_GENERIC(child2, &status, 0), child2);
189 1.1 kamil
190 1.1 kamil validate_status_exited(status, exitval2);
191 1.1 kamil
192 1.1 kamil DPRINTF("Before calling %s() for the forkee - expected no "
193 1.1 kamil "process\n", TWAIT_FNAME);
194 1.1 kamil TWAIT_REQUIRE_FAILURE(ECHILD,
195 1.1 kamil wpid = TWAIT_GENERIC(child2, &status, 0));
196 1.1 kamil }
197 1.1 kamil #endif
198 1.1 kamil
199 1.1 kamil DPRINTF("Before calling %s() for the child - expected stopped "
200 1.1 kamil "SIGCHLD\n", TWAIT_FNAME);
201 1.1 kamil TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
202 1.1 kamil
203 1.1 kamil validate_status_stopped(status, SIGCHLD);
204 1.1 kamil
205 1.1 kamil DPRINTF("Before resuming the child process where it left off and "
206 1.1 kamil "without signal to be sent\n");
207 1.1 kamil SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
208 1.1 kamil
209 1.1 kamil DPRINTF("Before calling %s() for the child - expected exited\n",
210 1.1 kamil TWAIT_FNAME);
211 1.1 kamil TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
212 1.1 kamil
213 1.1 kamil validate_status_exited(status, exitval);
214 1.1 kamil
215 1.1 kamil DPRINTF("Before calling %s() for the child - expected no process\n",
216 1.1 kamil TWAIT_FNAME);
217 1.1 kamil TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
218 1.1 kamil }
219 1.1 kamil
220 1.1 kamil #define CLONE_TEST(name,flags,tfork,tvfork,tvforkdone) \
221 1.1 kamil ATF_TC(name); \
222 1.1 kamil ATF_TC_HEAD(name, tc) \
223 1.1 kamil { \
224 1.1 kamil atf_tc_set_md_var(tc, "descr", "Verify clone(%s) " \
225 1.1 kamil "called with 0%s%s%s in EVENT_MASK", \
226 1.1 kamil #flags, \
227 1.1 kamil tfork ? "|PTRACE_FORK" : "", \
228 1.1 kamil tvfork ? "|PTRACE_VFORK" : "", \
229 1.1 kamil tvforkdone ? "|PTRACE_VFORK_DONE" : ""); \
230 1.1 kamil } \
231 1.1 kamil \
232 1.1 kamil ATF_TC_BODY(name, tc) \
233 1.1 kamil { \
234 1.1 kamil \
235 1.1 kamil clone_body(flags, tfork, tvfork, tvforkdone); \
236 1.1 kamil }
237 1.1 kamil
238 1.1 kamil CLONE_TEST(clone1, 0, false, false, false)
239 1.1 kamil #if defined(TWAIT_HAVE_PID)
240 1.1 kamil CLONE_TEST(clone2, 0, true, false, false)
241 1.1 kamil CLONE_TEST(clone3, 0, false, true, false)
242 1.1 kamil CLONE_TEST(clone4, 0, true, true, false)
243 1.1 kamil #endif
244 1.1 kamil CLONE_TEST(clone5, 0, false, false, true)
245 1.1 kamil #if defined(TWAIT_HAVE_PID)
246 1.1 kamil CLONE_TEST(clone6, 0, true, false, true)
247 1.1 kamil CLONE_TEST(clone7, 0, false, true, true)
248 1.1 kamil CLONE_TEST(clone8, 0, true, true, true)
249 1.1 kamil #endif
250 1.1 kamil
251 1.1 kamil CLONE_TEST(clone_vm1, CLONE_VM, false, false, false)
252 1.1 kamil #if defined(TWAIT_HAVE_PID)
253 1.1 kamil CLONE_TEST(clone_vm2, CLONE_VM, true, false, false)
254 1.1 kamil CLONE_TEST(clone_vm3, CLONE_VM, false, true, false)
255 1.1 kamil CLONE_TEST(clone_vm4, CLONE_VM, true, true, false)
256 1.1 kamil #endif
257 1.1 kamil CLONE_TEST(clone_vm5, CLONE_VM, false, false, true)
258 1.1 kamil #if defined(TWAIT_HAVE_PID)
259 1.1 kamil CLONE_TEST(clone_vm6, CLONE_VM, true, false, true)
260 1.1 kamil CLONE_TEST(clone_vm7, CLONE_VM, false, true, true)
261 1.1 kamil CLONE_TEST(clone_vm8, CLONE_VM, true, true, true)
262 1.1 kamil #endif
263 1.1 kamil
264 1.1 kamil CLONE_TEST(clone_fs1, CLONE_FS, false, false, false)
265 1.1 kamil #if defined(TWAIT_HAVE_PID)
266 1.1 kamil CLONE_TEST(clone_fs2, CLONE_FS, true, false, false)
267 1.1 kamil CLONE_TEST(clone_fs3, CLONE_FS, false, true, false)
268 1.1 kamil CLONE_TEST(clone_fs4, CLONE_FS, true, true, false)
269 1.1 kamil #endif
270 1.1 kamil CLONE_TEST(clone_fs5, CLONE_FS, false, false, true)
271 1.1 kamil #if defined(TWAIT_HAVE_PID)
272 1.1 kamil CLONE_TEST(clone_fs6, CLONE_FS, true, false, true)
273 1.1 kamil CLONE_TEST(clone_fs7, CLONE_FS, false, true, true)
274 1.1 kamil CLONE_TEST(clone_fs8, CLONE_FS, true, true, true)
275 1.1 kamil #endif
276 1.1 kamil
277 1.1 kamil CLONE_TEST(clone_files1, CLONE_FILES, false, false, false)
278 1.1 kamil #if defined(TWAIT_HAVE_PID)
279 1.1 kamil CLONE_TEST(clone_files2, CLONE_FILES, true, false, false)
280 1.1 kamil CLONE_TEST(clone_files3, CLONE_FILES, false, true, false)
281 1.1 kamil CLONE_TEST(clone_files4, CLONE_FILES, true, true, false)
282 1.1 kamil #endif
283 1.1 kamil CLONE_TEST(clone_files5, CLONE_FILES, false, false, true)
284 1.1 kamil #if defined(TWAIT_HAVE_PID)
285 1.1 kamil CLONE_TEST(clone_files6, CLONE_FILES, true, false, true)
286 1.1 kamil CLONE_TEST(clone_files7, CLONE_FILES, false, true, true)
287 1.1 kamil CLONE_TEST(clone_files8, CLONE_FILES, true, true, true)
288 1.1 kamil #endif
289 1.1 kamil
290 1.1 kamil //CLONE_TEST(clone_sighand1, CLONE_SIGHAND, false, false, false)
291 1.1 kamil #if defined(TWAIT_HAVE_PID)
292 1.1 kamil //CLONE_TEST(clone_sighand2, CLONE_SIGHAND, true, false, false)
293 1.1 kamil //CLONE_TEST(clone_sighand3, CLONE_SIGHAND, false, true, false)
294 1.1 kamil //CLONE_TEST(clone_sighand4, CLONE_SIGHAND, true, true, false)
295 1.1 kamil #endif
296 1.1 kamil //CLONE_TEST(clone_sighand5, CLONE_SIGHAND, false, false, true)
297 1.1 kamil #if defined(TWAIT_HAVE_PID)
298 1.1 kamil //CLONE_TEST(clone_sighand6, CLONE_SIGHAND, true, false, true)
299 1.1 kamil //CLONE_TEST(clone_sighand7, CLONE_SIGHAND, false, true, true)
300 1.1 kamil //CLONE_TEST(clone_sighand8, CLONE_SIGHAND, true, true, true)
301 1.1 kamil #endif
302 1.1 kamil
303 1.1 kamil CLONE_TEST(clone_vfork1, CLONE_VFORK, false, false, false)
304 1.1 kamil #if defined(TWAIT_HAVE_PID)
305 1.1 kamil CLONE_TEST(clone_vfork2, CLONE_VFORK, true, false, false)
306 1.1 kamil CLONE_TEST(clone_vfork3, CLONE_VFORK, false, true, false)
307 1.1 kamil CLONE_TEST(clone_vfork4, CLONE_VFORK, true, true, false)
308 1.1 kamil #endif
309 1.1 kamil CLONE_TEST(clone_vfork5, CLONE_VFORK, false, false, true)
310 1.1 kamil #if defined(TWAIT_HAVE_PID)
311 1.1 kamil CLONE_TEST(clone_vfork6, CLONE_VFORK, true, false, true)
312 1.1 kamil CLONE_TEST(clone_vfork7, CLONE_VFORK, false, true, true)
313 1.1 kamil CLONE_TEST(clone_vfork8, CLONE_VFORK, true, true, true)
314 1.1 kamil #endif
315 1.1 kamil
316 1.1 kamil /// ----------------------------------------------------------------------------
317 1.1 kamil
318 1.1 kamil #if defined(TWAIT_HAVE_PID)
319 1.1 kamil static void
320 1.1 kamil clone_body2(int flags, bool masked, bool ignored)
321 1.1 kamil {
322 1.1 kamil const int exitval = 5;
323 1.1 kamil const int exitval2 = 15;
324 1.1 kamil const int sigval = SIGSTOP;
325 1.1 kamil pid_t child, child2 = 0, wpid;
326 1.1 kamil #if defined(TWAIT_HAVE_STATUS)
327 1.1 kamil int status;
328 1.1 kamil #endif
329 1.1 kamil ptrace_state_t state;
330 1.1 kamil const int slen = sizeof(state);
331 1.1 kamil ptrace_event_t event;
332 1.1 kamil const int elen = sizeof(event);
333 1.1 kamil struct sigaction sa;
334 1.1 kamil struct ptrace_siginfo info;
335 1.1 kamil sigset_t intmask;
336 1.1 kamil struct kinfo_proc2 kp;
337 1.1 kamil size_t len = sizeof(kp);
338 1.1 kamil
339 1.1 kamil int name[6];
340 1.1 kamil const size_t namelen = __arraycount(name);
341 1.1 kamil ki_sigset_t kp_sigmask;
342 1.1 kamil ki_sigset_t kp_sigignore;
343 1.1 kamil
344 1.1 kamil const size_t stack_size = 1024 * 1024;
345 1.1 kamil void *stack, *stack_base;
346 1.1 kamil
347 1.1 kamil stack = malloc(stack_size);
348 1.1 kamil ATF_REQUIRE(stack != NULL);
349 1.1 kamil
350 1.1 kamil #ifdef __MACHINE_STACK_GROWS_UP
351 1.1 kamil stack_base = stack;
352 1.1 kamil #else
353 1.1 kamil stack_base = (char *)stack + stack_size;
354 1.1 kamil #endif
355 1.1 kamil
356 1.1 kamil SYSCALL_REQUIRE((child = fork()) != -1);
357 1.1 kamil if (child == 0) {
358 1.1 kamil DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
359 1.1 kamil FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
360 1.1 kamil
361 1.1 kamil if (masked) {
362 1.1 kamil sigemptyset(&intmask);
363 1.1 kamil sigaddset(&intmask, SIGTRAP);
364 1.1 kamil sigprocmask(SIG_BLOCK, &intmask, NULL);
365 1.1 kamil }
366 1.1 kamil
367 1.1 kamil if (ignored) {
368 1.1 kamil memset(&sa, 0, sizeof(sa));
369 1.1 kamil sa.sa_handler = SIG_IGN;
370 1.1 kamil sigemptyset(&sa.sa_mask);
371 1.1 kamil FORKEE_ASSERT(sigaction(SIGTRAP, &sa, NULL) != -1);
372 1.1 kamil }
373 1.1 kamil DPRINTF("Before raising %s from child\n", strsignal(sigval));
374 1.1 kamil FORKEE_ASSERT(raise(sigval) == 0);
375 1.1 kamil
376 1.1 kamil DPRINTF("Before forking process PID=%d flags=%#x\n", getpid(),
377 1.1 kamil flags);
378 1.1 kamil SYSCALL_REQUIRE((child2 = __clone(clone_func, stack_base,
379 1.1 kamil flags|SIGCHLD, (void *)(intptr_t)exitval2)) != -1);
380 1.1 kamil
381 1.1 kamil DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(),
382 1.1 kamil child2);
383 1.1 kamil
384 1.1 kamil // XXX WALLSIG?
385 1.1 kamil FORKEE_REQUIRE_SUCCESS
386 1.1 kamil (wpid = TWAIT_GENERIC(child2, &status, WALLSIG), child2);
387 1.1 kamil
388 1.1 kamil forkee_status_exited(status, exitval2);
389 1.1 kamil
390 1.1 kamil DPRINTF("Before exiting of the child process\n");
391 1.1 kamil _exit(exitval);
392 1.1 kamil }
393 1.1 kamil DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
394 1.1 kamil
395 1.1 kamil DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
396 1.1 kamil TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
397 1.1 kamil
398 1.1 kamil validate_status_stopped(status, sigval);
399 1.1 kamil
400 1.1 kamil DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
401 1.1 kamil SYSCALL_REQUIRE(
402 1.1 kamil ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1);
403 1.1 kamil
404 1.1 kamil DPRINTF("Before checking siginfo_t\n");
405 1.1 kamil ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sigval);
406 1.1 kamil ATF_REQUIRE_EQ(info.psi_siginfo.si_code, SI_LWP);
407 1.1 kamil
408 1.1 kamil name[0] = CTL_KERN,
409 1.1 kamil name[1] = KERN_PROC2,
410 1.1 kamil name[2] = KERN_PROC_PID;
411 1.1 kamil name[3] = child;
412 1.1 kamil name[4] = sizeof(kp);
413 1.1 kamil name[5] = 1;
414 1.1 kamil
415 1.1 kamil FORKEE_ASSERT_EQ(sysctl(name, namelen, &kp, &len, NULL, 0), 0);
416 1.1 kamil
417 1.3 kamil kp_sigmask = kp.p_sigmask;
418 1.3 kamil kp_sigignore = kp.p_sigignore;
419 1.1 kamil
420 1.1 kamil DPRINTF("Set PTRACE_FORK | PTRACE_VFORK | PTRACE_VFORK_DONE in "
421 1.1 kamil "EVENT_MASK for the child %d\n", child);
422 1.1 kamil event.pe_set_event = PTRACE_FORK | PTRACE_VFORK | PTRACE_VFORK_DONE;
423 1.1 kamil SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1);
424 1.1 kamil
425 1.1 kamil DPRINTF("Before resuming the child process where it left off and "
426 1.1 kamil "without signal to be sent\n");
427 1.1 kamil SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
428 1.1 kamil
429 1.1 kamil DPRINTF("Before calling %s() for the child %d\n", TWAIT_FNAME,
430 1.1 kamil child);
431 1.1 kamil TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0),
432 1.1 kamil child);
433 1.1 kamil
434 1.1 kamil validate_status_stopped(status, SIGTRAP);
435 1.1 kamil
436 1.1 kamil ATF_REQUIRE_EQ(sysctl(name, namelen, &kp, &len, NULL, 0), 0);
437 1.1 kamil
438 1.1 kamil if (masked) {
439 1.1 kamil DPRINTF("kp_sigmask="
440 1.1 kamil "%#02" PRIx32 "%02" PRIx32 "%02" PRIx32 "%02"
441 1.1 kamil PRIx32 "\n",
442 1.1 kamil kp_sigmask.__bits[0], kp_sigmask.__bits[1],
443 1.1 kamil kp_sigmask.__bits[2], kp_sigmask.__bits[3]);
444 1.1 kamil
445 1.1 kamil DPRINTF("kp.p_sigmask="
446 1.1 kamil "%#02" PRIx32 "%02" PRIx32 "%02" PRIx32 "%02"
447 1.1 kamil PRIx32 "\n",
448 1.1 kamil kp.p_sigmask.__bits[0], kp.p_sigmask.__bits[1],
449 1.1 kamil kp.p_sigmask.__bits[2], kp.p_sigmask.__bits[3]);
450 1.1 kamil
451 1.3 kamil ATF_REQUIRE(sigismember((sigset_t *)&kp.p_sigmask,
452 1.3 kamil SIGTRAP));
453 1.1 kamil }
454 1.1 kamil
455 1.1 kamil if (ignored) {
456 1.1 kamil DPRINTF("kp_sigignore="
457 1.1 kamil "%#02" PRIx32 "%02" PRIx32 "%02" PRIx32 "%02"
458 1.1 kamil PRIx32 "\n",
459 1.1 kamil kp_sigignore.__bits[0], kp_sigignore.__bits[1],
460 1.1 kamil kp_sigignore.__bits[2], kp_sigignore.__bits[3]);
461 1.1 kamil
462 1.1 kamil DPRINTF("kp.p_sigignore="
463 1.1 kamil "%#02" PRIx32 "%02" PRIx32 "%02" PRIx32 "%02"
464 1.1 kamil PRIx32 "\n",
465 1.1 kamil kp.p_sigignore.__bits[0], kp.p_sigignore.__bits[1],
466 1.1 kamil kp.p_sigignore.__bits[2], kp.p_sigignore.__bits[3]);
467 1.1 kamil
468 1.3 kamil ATF_REQUIRE(sigismember((sigset_t *)&kp.p_sigignore,
469 1.3 kamil SIGTRAP));
470 1.1 kamil }
471 1.1 kamil
472 1.1 kamil SYSCALL_REQUIRE(
473 1.1 kamil ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1);
474 1.1 kamil DPRINTF("state.pe_report_event=%#x pid=%d\n", state.pe_report_event,
475 1.1 kamil child2);
476 1.1 kamil if (!(flags & CLONE_VFORK)) {
477 1.1 kamil ATF_REQUIRE_EQ(state.pe_report_event & PTRACE_FORK,
478 1.1 kamil PTRACE_FORK);
479 1.1 kamil } else {
480 1.1 kamil ATF_REQUIRE_EQ(state.pe_report_event & PTRACE_VFORK,
481 1.1 kamil PTRACE_VFORK);
482 1.1 kamil }
483 1.1 kamil
484 1.1 kamil child2 = state.pe_other_pid;
485 1.1 kamil DPRINTF("Reported ptrace event with forkee %d\n", child2);
486 1.1 kamil
487 1.1 kamil DPRINTF("Before calling %s() for the forkee %d of the child "
488 1.1 kamil "%d\n", TWAIT_FNAME, child2, child);
489 1.1 kamil TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child2, &status, 0),
490 1.1 kamil child2);
491 1.1 kamil
492 1.1 kamil validate_status_stopped(status, SIGTRAP);
493 1.1 kamil
494 1.1 kamil name[3] = child2;
495 1.1 kamil ATF_REQUIRE_EQ(sysctl(name, namelen, &kp, &len, NULL, 0), 0);
496 1.1 kamil
497 1.1 kamil if (masked) {
498 1.1 kamil DPRINTF("kp_sigmask="
499 1.1 kamil "%#02" PRIx32 "%02" PRIx32 "%02" PRIx32 "%02"
500 1.1 kamil PRIx32 "\n",
501 1.1 kamil kp_sigmask.__bits[0], kp_sigmask.__bits[1],
502 1.1 kamil kp_sigmask.__bits[2], kp_sigmask.__bits[3]);
503 1.1 kamil
504 1.1 kamil DPRINTF("kp.p_sigmask="
505 1.1 kamil "%#02" PRIx32 "%02" PRIx32 "%02" PRIx32 "%02"
506 1.1 kamil PRIx32 "\n",
507 1.1 kamil kp.p_sigmask.__bits[0], kp.p_sigmask.__bits[1],
508 1.1 kamil kp.p_sigmask.__bits[2], kp.p_sigmask.__bits[3]);
509 1.1 kamil
510 1.3 kamil ATF_REQUIRE(sigismember((sigset_t *)&kp.p_sigmask,
511 1.3 kamil SIGTRAP));
512 1.1 kamil }
513 1.1 kamil
514 1.1 kamil if (ignored) {
515 1.1 kamil DPRINTF("kp_sigignore="
516 1.1 kamil "%#02" PRIx32 "%02" PRIx32 "%02" PRIx32 "%02"
517 1.1 kamil PRIx32 "\n",
518 1.1 kamil kp_sigignore.__bits[0], kp_sigignore.__bits[1],
519 1.1 kamil kp_sigignore.__bits[2], kp_sigignore.__bits[3]);
520 1.1 kamil
521 1.1 kamil DPRINTF("kp.p_sigignore="
522 1.1 kamil "%#02" PRIx32 "%02" PRIx32 "%02" PRIx32 "%02"
523 1.1 kamil PRIx32 "\n",
524 1.1 kamil kp.p_sigignore.__bits[0], kp.p_sigignore.__bits[1],
525 1.1 kamil kp.p_sigignore.__bits[2], kp.p_sigignore.__bits[3]);
526 1.1 kamil
527 1.3 kamil ATF_REQUIRE(sigismember((sigset_t *)&kp.p_sigignore,
528 1.3 kamil SIGTRAP));
529 1.1 kamil }
530 1.1 kamil
531 1.1 kamil SYSCALL_REQUIRE(
532 1.1 kamil ptrace(PT_GET_PROCESS_STATE, child2, &state, slen) != -1);
533 1.1 kamil if (!(flags & CLONE_VFORK)) {
534 1.1 kamil ATF_REQUIRE_EQ(state.pe_report_event & PTRACE_FORK,
535 1.1 kamil PTRACE_FORK);
536 1.1 kamil } else {
537 1.1 kamil ATF_REQUIRE_EQ(state.pe_report_event & PTRACE_VFORK,
538 1.1 kamil PTRACE_VFORK);
539 1.1 kamil }
540 1.1 kamil
541 1.1 kamil ATF_REQUIRE_EQ(state.pe_other_pid, child);
542 1.1 kamil
543 1.1 kamil DPRINTF("Before resuming the forkee process where it left off "
544 1.1 kamil "and without signal to be sent\n");
545 1.1 kamil SYSCALL_REQUIRE(
546 1.1 kamil ptrace(PT_CONTINUE, child2, (void *)1, 0) != -1);
547 1.1 kamil
548 1.1 kamil DPRINTF("Before resuming the child process where it left off "
549 1.1 kamil "and without signal to be sent\n");
550 1.1 kamil SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
551 1.1 kamil
552 1.1 kamil if (flags & CLONE_VFORK) {
553 1.1 kamil DPRINTF("Before calling %s() for the child %d\n", TWAIT_FNAME,
554 1.1 kamil child);
555 1.1 kamil TWAIT_REQUIRE_SUCCESS(
556 1.1 kamil wpid = TWAIT_GENERIC(child, &status, 0), child);
557 1.1 kamil
558 1.1 kamil validate_status_stopped(status, SIGTRAP);
559 1.1 kamil
560 1.1 kamil name[3] = child;
561 1.1 kamil ATF_REQUIRE_EQ(sysctl(name, namelen, &kp, &len, NULL, 0), 0);
562 1.1 kamil
563 1.1 kamil /*
564 1.1 kamil * SIGCHLD is now pending in the signal queue and
565 1.1 kamil * the kernel presents it to userland as a masked signal.
566 1.1 kamil */
567 1.1 kamil sigdelset((sigset_t *)&kp.p_sigmask, SIGCHLD);
568 1.1 kamil
569 1.1 kamil if (masked) {
570 1.1 kamil DPRINTF("kp_sigmask="
571 1.1 kamil "%#02" PRIx32 "%02" PRIx32 "%02" PRIx32 "%02"
572 1.1 kamil PRIx32 "\n",
573 1.1 kamil kp_sigmask.__bits[0], kp_sigmask.__bits[1],
574 1.1 kamil kp_sigmask.__bits[2], kp_sigmask.__bits[3]);
575 1.1 kamil
576 1.1 kamil DPRINTF("kp.p_sigmask="
577 1.1 kamil "%#02" PRIx32 "%02" PRIx32 "%02" PRIx32 "%02"
578 1.1 kamil PRIx32 "\n",
579 1.1 kamil kp.p_sigmask.__bits[0], kp.p_sigmask.__bits[1],
580 1.1 kamil kp.p_sigmask.__bits[2], kp.p_sigmask.__bits[3]);
581 1.1 kamil
582 1.1 kamil ATF_REQUIRE(!memcmp(&kp_sigmask, &kp.p_sigmask,
583 1.1 kamil sizeof(kp_sigmask)));
584 1.1 kamil }
585 1.1 kamil
586 1.1 kamil if (ignored) {
587 1.1 kamil DPRINTF("kp_sigignore="
588 1.1 kamil "%#02" PRIx32 "%02" PRIx32 "%02" PRIx32 "%02"
589 1.1 kamil PRIx32 "\n",
590 1.1 kamil kp_sigignore.__bits[0], kp_sigignore.__bits[1],
591 1.1 kamil kp_sigignore.__bits[2], kp_sigignore.__bits[3]);
592 1.1 kamil
593 1.1 kamil DPRINTF("kp.p_sigignore="
594 1.1 kamil "%#02" PRIx32 "%02" PRIx32 "%02" PRIx32 "%02"
595 1.1 kamil PRIx32 "\n",
596 1.1 kamil kp.p_sigignore.__bits[0], kp.p_sigignore.__bits[1],
597 1.1 kamil kp.p_sigignore.__bits[2], kp.p_sigignore.__bits[3]);
598 1.1 kamil
599 1.1 kamil ATF_REQUIRE(!memcmp(&kp_sigignore, &kp.p_sigignore,
600 1.1 kamil sizeof(kp_sigignore)));
601 1.1 kamil }
602 1.1 kamil
603 1.1 kamil SYSCALL_REQUIRE(
604 1.1 kamil ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1);
605 1.1 kamil ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_VFORK_DONE);
606 1.1 kamil
607 1.1 kamil child2 = state.pe_other_pid;
608 1.1 kamil DPRINTF("Reported PTRACE_VFORK_DONE event with forkee %d\n",
609 1.1 kamil child2);
610 1.1 kamil
611 1.1 kamil DPRINTF("Before resuming the child process where it left off "
612 1.1 kamil "and without signal to be sent\n");
613 1.1 kamil SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
614 1.1 kamil }
615 1.1 kamil
616 1.1 kamil DPRINTF("Before calling %s() for the forkee - expected exited"
617 1.1 kamil "\n", TWAIT_FNAME);
618 1.1 kamil TWAIT_REQUIRE_SUCCESS(
619 1.1 kamil wpid = TWAIT_GENERIC(child2, &status, 0), child2);
620 1.1 kamil
621 1.1 kamil validate_status_exited(status, exitval2);
622 1.1 kamil
623 1.1 kamil DPRINTF("Before calling %s() for the forkee - expected no "
624 1.1 kamil "process\n", TWAIT_FNAME);
625 1.1 kamil TWAIT_REQUIRE_FAILURE(ECHILD,
626 1.1 kamil wpid = TWAIT_GENERIC(child2, &status, 0));
627 1.1 kamil
628 1.1 kamil DPRINTF("Before calling %s() for the child - expected stopped "
629 1.1 kamil "SIGCHLD\n", TWAIT_FNAME);
630 1.1 kamil TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
631 1.1 kamil
632 1.1 kamil validate_status_stopped(status, SIGCHLD);
633 1.1 kamil
634 1.1 kamil DPRINTF("Before resuming the child process where it left off and "
635 1.1 kamil "without signal to be sent\n");
636 1.1 kamil SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
637 1.1 kamil
638 1.1 kamil DPRINTF("Before calling %s() for the child - expected exited\n",
639 1.1 kamil TWAIT_FNAME);
640 1.1 kamil TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
641 1.1 kamil
642 1.1 kamil validate_status_exited(status, exitval);
643 1.1 kamil
644 1.1 kamil DPRINTF("Before calling %s() for the child - expected no process\n",
645 1.1 kamil TWAIT_FNAME);
646 1.1 kamil TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
647 1.1 kamil }
648 1.1 kamil
649 1.1 kamil #define CLONE_TEST2(name,flags,masked,ignored) \
650 1.1 kamil ATF_TC(name); \
651 1.1 kamil ATF_TC_HEAD(name, tc) \
652 1.1 kamil { \
653 1.1 kamil atf_tc_set_md_var(tc, "descr", "Verify that clone(%s) is caught"\
654 1.1 kamil " regardless of signal %s%s", \
655 1.1 kamil #flags, masked ? "masked" : "", ignored ? "ignored" : ""); \
656 1.1 kamil } \
657 1.1 kamil \
658 1.1 kamil ATF_TC_BODY(name, tc) \
659 1.1 kamil { \
660 1.1 kamil \
661 1.1 kamil clone_body2(flags, masked, ignored); \
662 1.1 kamil }
663 1.1 kamil
664 1.1 kamil CLONE_TEST2(clone_signalignored, 0, true, false)
665 1.1 kamil CLONE_TEST2(clone_signalmasked, 0, false, true)
666 1.1 kamil CLONE_TEST2(clone_vm_signalignored, CLONE_VM, true, false)
667 1.1 kamil CLONE_TEST2(clone_vm_signalmasked, CLONE_VM, false, true)
668 1.1 kamil CLONE_TEST2(clone_fs_signalignored, CLONE_FS, true, false)
669 1.1 kamil CLONE_TEST2(clone_fs_signalmasked, CLONE_FS, false, true)
670 1.1 kamil CLONE_TEST2(clone_files_signalignored, CLONE_FILES, true, false)
671 1.1 kamil CLONE_TEST2(clone_files_signalmasked, CLONE_FILES, false, true)
672 1.1 kamil //CLONE_TEST2(clone_sighand_signalignored, CLONE_SIGHAND, true, false) // XXX
673 1.1 kamil //CLONE_TEST2(clone_sighand_signalmasked, CLONE_SIGHAND, false, true) // XXX
674 1.1 kamil CLONE_TEST2(clone_vfork_signalignored, CLONE_VFORK, true, false)
675 1.1 kamil CLONE_TEST2(clone_vfork_signalmasked, CLONE_VFORK, false, true)
676 1.1 kamil #endif
677 1.1 kamil
678 1.1 kamil /// ----------------------------------------------------------------------------
679 1.1 kamil
680 1.1 kamil #if defined(TWAIT_HAVE_PID)
681 1.1 kamil static void
682 1.1 kamil traceme_vfork_clone_body(int flags)
683 1.1 kamil {
684 1.1 kamil const int exitval = 5;
685 1.1 kamil const int exitval2 = 15;
686 1.1 kamil pid_t child, child2 = 0, wpid;
687 1.1 kamil #if defined(TWAIT_HAVE_STATUS)
688 1.1 kamil int status;
689 1.1 kamil #endif
690 1.1 kamil
691 1.1 kamil const size_t stack_size = 1024 * 1024;
692 1.1 kamil void *stack, *stack_base;
693 1.1 kamil
694 1.1 kamil stack = malloc(stack_size);
695 1.1 kamil ATF_REQUIRE(stack != NULL);
696 1.1 kamil
697 1.1 kamil #ifdef __MACHINE_STACK_GROWS_UP
698 1.1 kamil stack_base = stack;
699 1.1 kamil #else
700 1.1 kamil stack_base = (char *)stack + stack_size;
701 1.1 kamil #endif
702 1.1 kamil
703 1.1 kamil SYSCALL_REQUIRE((child = vfork()) != -1);
704 1.1 kamil if (child == 0) {
705 1.1 kamil DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
706 1.1 kamil FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
707 1.1 kamil
708 1.1 kamil DPRINTF("Before forking process PID=%d flags=%#x\n", getpid(),
709 1.1 kamil flags);
710 1.1 kamil SYSCALL_REQUIRE((child2 = __clone(clone_func, stack_base,
711 1.1 kamil flags|SIGCHLD, (void *)(intptr_t)exitval2)) != -1);
712 1.1 kamil
713 1.1 kamil DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(),
714 1.1 kamil child2);
715 1.1 kamil
716 1.1 kamil // XXX WALLSIG?
717 1.1 kamil FORKEE_REQUIRE_SUCCESS
718 1.1 kamil (wpid = TWAIT_GENERIC(child2, &status, WALLSIG), child2);
719 1.1 kamil
720 1.1 kamil forkee_status_exited(status, exitval2);
721 1.1 kamil
722 1.1 kamil DPRINTF("Before exiting of the child process\n");
723 1.1 kamil _exit(exitval);
724 1.1 kamil }
725 1.1 kamil DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
726 1.1 kamil
727 1.1 kamil DPRINTF("Before calling %s() for the child - expected exited\n",
728 1.1 kamil TWAIT_FNAME);
729 1.1 kamil TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
730 1.1 kamil
731 1.1 kamil validate_status_exited(status, exitval);
732 1.1 kamil
733 1.1 kamil DPRINTF("Before calling %s() for the child - expected no process\n",
734 1.1 kamil TWAIT_FNAME);
735 1.1 kamil TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
736 1.1 kamil }
737 1.1 kamil
738 1.1 kamil #define TRACEME_VFORK_CLONE_TEST(name,flags) \
739 1.1 kamil ATF_TC(name); \
740 1.1 kamil ATF_TC_HEAD(name, tc) \
741 1.1 kamil { \
742 1.1 kamil atf_tc_set_md_var(tc, "descr", "Verify that clone(%s) is " \
743 1.1 kamil "handled correctly with vfork(2)ed tracer", \
744 1.1 kamil #flags); \
745 1.1 kamil } \
746 1.1 kamil \
747 1.1 kamil ATF_TC_BODY(name, tc) \
748 1.1 kamil { \
749 1.1 kamil \
750 1.1 kamil traceme_vfork_clone_body(flags); \
751 1.1 kamil }
752 1.1 kamil
753 1.1 kamil TRACEME_VFORK_CLONE_TEST(traceme_vfork_clone, 0)
754 1.1 kamil TRACEME_VFORK_CLONE_TEST(traceme_vfork_clone_vm, CLONE_VM)
755 1.1 kamil TRACEME_VFORK_CLONE_TEST(traceme_vfork_clone_fs, CLONE_FS)
756 1.1 kamil TRACEME_VFORK_CLONE_TEST(traceme_vfork_clone_files, CLONE_FILES)
757 1.1 kamil //TRACEME_VFORK_CLONE_TEST(traceme_vfork_clone_sighand, CLONE_SIGHAND) // XXX
758 1.1 kamil TRACEME_VFORK_CLONE_TEST(traceme_vfork_clone_vfork, CLONE_VFORK)
759 1.1 kamil #endif
760 1.1 kamil
761 1.1 kamil #define ATF_TP_ADD_TCS_PTRACE_WAIT_CLONE() \
762 1.1 kamil ATF_TP_ADD_TC(tp, clone1); \
763 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone2); \
764 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone3); \
765 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone4); \
766 1.1 kamil ATF_TP_ADD_TC(tp, clone5); \
767 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone6); \
768 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone7); \
769 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone8); \
770 1.1 kamil ATF_TP_ADD_TC(tp, clone_vm1); \
771 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_vm2); \
772 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_vm3); \
773 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_vm4); \
774 1.1 kamil ATF_TP_ADD_TC(tp, clone_vm5); \
775 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_vm6); \
776 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_vm7); \
777 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_vm8); \
778 1.1 kamil ATF_TP_ADD_TC(tp, clone_fs1); \
779 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_fs2); \
780 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_fs3); \
781 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_fs4); \
782 1.1 kamil ATF_TP_ADD_TC(tp, clone_fs5); \
783 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_fs6); \
784 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_fs7); \
785 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_fs8); \
786 1.1 kamil ATF_TP_ADD_TC(tp, clone_files1); \
787 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_files2); \
788 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_files3); \
789 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_files4); \
790 1.1 kamil ATF_TP_ADD_TC(tp, clone_files5); \
791 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_files6); \
792 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_files7); \
793 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_files8); \
794 1.1 kamil ATF_TP_ADD_TC(tp, clone_vfork1); \
795 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_vfork2); \
796 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_vfork3); \
797 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_vfork4); \
798 1.1 kamil ATF_TP_ADD_TC(tp, clone_vfork5); \
799 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_vfork6); \
800 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_vfork7); \
801 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_vfork8); \
802 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_signalignored); \
803 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_signalmasked); \
804 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_vm_signalignored); \
805 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_vm_signalmasked); \
806 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_fs_signalignored); \
807 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_fs_signalmasked); \
808 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_files_signalignored); \
809 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_files_signalmasked); \
810 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_vfork_signalignored); \
811 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, clone_vfork_signalmasked); \
812 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, traceme_vfork_clone); \
813 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, traceme_vfork_clone_vm); \
814 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, traceme_vfork_clone_fs); \
815 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, traceme_vfork_clone_files); \
816 1.1 kamil ATF_TP_ADD_TC_HAVE_PID(tp, traceme_vfork_clone_vfork);
817 1.1 kamil
818 1.1 kamil // ATF_TP_ADD_TC(tp, clone_sighand1); // XXX
819 1.1 kamil // ATF_TP_ADD_TC_HAVE_PID(tp, clone_sighand2); // XXX
820 1.1 kamil // ATF_TP_ADD_TC_HAVE_PID(tp, clone_sighand3); // XXX
821 1.1 kamil // ATF_TP_ADD_TC_HAVE_PID(tp, clone_sighand4); // XXX
822 1.1 kamil // ATF_TP_ADD_TC(tp, clone_sighand5); // XXX
823 1.1 kamil // ATF_TP_ADD_TC_HAVE_PID(tp, clone_sighand6); // XXX
824 1.1 kamil // ATF_TP_ADD_TC_HAVE_PID(tp, clone_sighand7); // XXX
825 1.1 kamil // ATF_TP_ADD_TC_HAVE_PID(tp, clone_sighand8); // XXX
826 1.1 kamil
827 1.1 kamil // ATF_TP_ADD_TC_HAVE_PID(tp, clone_sighand_signalignored); // XXX
828 1.1 kamil // ATF_TP_ADD_TC_HAVE_PID(tp, clone_sighand_signalmasked); // XXX
829 1.1 kamil
830 1.1 kamil // ATF_TP_ADD_TC_HAVE_PID(tp, traceme_vfork_clone_sighand); // XXX
831