t_siginfo.c revision 272343
1272343Sngie/* $NetBSD: t_siginfo.c,v 1.23 2014/02/09 21:26:07 jmmv Exp $ */
2272343Sngie
3272343Sngie/*-
4272343Sngie * Copyright (c) 2010 The NetBSD Foundation, Inc.
5272343Sngie * All rights reserved.
6272343Sngie *
7272343Sngie * Redistribution and use in source and binary forms, with or without
8272343Sngie * modification, are permitted provided that the following conditions
9272343Sngie * are met:
10272343Sngie * 1. Redistributions of source code must retain the above copyright
11272343Sngie *    notice, this list of conditions and the following disclaimer.
12272343Sngie * 2. Redistributions in binary form must reproduce the above copyright
13272343Sngie *    notice, this list of conditions and the following disclaimer in the
14272343Sngie *    documentation and/or other materials provided with the distribution.
15272343Sngie *
16272343Sngie * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17272343Sngie * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18272343Sngie * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19272343Sngie * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20272343Sngie * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21272343Sngie * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22272343Sngie * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23272343Sngie * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24272343Sngie * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25272343Sngie * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26272343Sngie * POSSIBILITY OF SUCH DAMAGE.
27272343Sngie */
28272343Sngie
29272343Sngie#include <atf-c.h>
30272343Sngie#include <atf-c/config.h>
31272343Sngie
32272343Sngie#include <sys/inttypes.h>
33272343Sngie#include <sys/resource.h>
34272343Sngie#include <sys/sysctl.h>
35272343Sngie#include <sys/time.h>
36272343Sngie#include <sys/ucontext.h>
37272343Sngie#include <sys/wait.h>
38272343Sngie
39272343Sngie#include <assert.h>
40272343Sngie#include <signal.h>
41272343Sngie#include <stdio.h>
42272343Sngie#include <stdlib.h>
43272343Sngie#include <string.h>
44272343Sngie#include <unistd.h>
45272343Sngie#include <setjmp.h>
46272343Sngie#include <float.h>
47272343Sngie
48272343Sngie#ifdef HAVE_FENV
49272343Sngie#include <fenv.h>
50272343Sngie#elif defined(_FLOAT_IEEE754)
51272343Sngie#include <ieeefp.h>
52272343Sngie#endif
53272343Sngie
54272343Sngie#include "isqemu.h"
55272343Sngie
56272343Sngie/* for sigbus */
57272343Sngievolatile char *addr;
58272343Sngie
59272343Sngie/* for sigchild */
60272343Sngiepid_t child;
61272343Sngieint code;
62272343Sngieint status;
63272343Sngie
64272343Sngie/* for sigfpe */
65272343Sngiesig_atomic_t fltdiv_signalled = 0;
66272343Sngiesig_atomic_t intdiv_signalled = 0;
67272343Sngie
68272343Sngiestatic void
69272343Sngiesig_debug(int signo, siginfo_t *info, ucontext_t *ctx)
70272343Sngie{
71272343Sngie	unsigned int i;
72272343Sngie
73272343Sngie	printf("%d %p %p\n", signo, info, ctx);
74272343Sngie	if (info != NULL) {
75272343Sngie		printf("si_signo=%d\n", info->si_signo);
76272343Sngie		printf("si_errno=%d\n", info->si_errno);
77272343Sngie		printf("si_code=%d\n", info->si_code);
78272343Sngie		printf("si_value.sival_int=%d\n", info->si_value.sival_int);
79272343Sngie	}
80272343Sngie	if (ctx != NULL) {
81272343Sngie		printf("uc_flags 0x%x\n", ctx->uc_flags);
82272343Sngie		printf("uc_link %p\n", ctx->uc_link);
83272343Sngie		for (i = 0; i < __arraycount(ctx->uc_sigmask.__bits); i++)
84272343Sngie			printf("uc_sigmask[%d] 0x%x\n", i,
85272343Sngie			    ctx->uc_sigmask.__bits[i]);
86272343Sngie		printf("uc_stack %p %lu 0x%x\n", ctx->uc_stack.ss_sp,
87272343Sngie		    (unsigned long)ctx->uc_stack.ss_size,
88272343Sngie		    ctx->uc_stack.ss_flags);
89272343Sngie		for (i = 0; i < __arraycount(ctx->uc_mcontext.__gregs); i++)
90272343Sngie			printf("uc_mcontext.greg[%d] 0x%lx\n", i,
91272343Sngie			    (long)ctx->uc_mcontext.__gregs[i]);
92272343Sngie	}
93272343Sngie}
94272343Sngie
95272343Sngiestatic void
96272343Sngiesigalrm_action(int signo, siginfo_t *info, void *ptr)
97272343Sngie{
98272343Sngie
99272343Sngie	sig_debug(signo, info, (ucontext_t *)ptr);
100272343Sngie
101272343Sngie	ATF_REQUIRE_EQ(info->si_signo, SIGALRM);
102272343Sngie	ATF_REQUIRE_EQ(info->si_code, SI_TIMER);
103272343Sngie	ATF_REQUIRE_EQ(info->si_value.sival_int, ITIMER_REAL);
104272343Sngie
105272343Sngie	atf_tc_pass();
106272343Sngie	/* NOTREACHED */
107272343Sngie}
108272343Sngie
109272343SngieATF_TC(sigalarm);
110272343Sngie
111272343SngieATF_TC_HEAD(sigalarm, tc)
112272343Sngie{
113272343Sngie
114272343Sngie	atf_tc_set_md_var(tc, "descr",
115272343Sngie	    "Checks that signal trampoline correctly calls SIGALRM handler");
116272343Sngie}
117272343Sngie
118272343SngieATF_TC_BODY(sigalarm, tc)
119272343Sngie{
120272343Sngie	struct sigaction sa;
121272343Sngie	sa.sa_flags = SA_SIGINFO;
122272343Sngie	sa.sa_sigaction = sigalrm_action;
123272343Sngie	sigemptyset(&sa.sa_mask);
124272343Sngie	sigaction(SIGALRM, &sa, NULL);
125272343Sngie	for (;;) {
126272343Sngie		alarm(1);
127272343Sngie		sleep(1);
128272343Sngie	}
129272343Sngie	atf_tc_fail("SIGALRM handler wasn't called");
130272343Sngie}
131272343Sngie
132272343Sngiestatic void
133272343Sngiesigchild_action(int signo, siginfo_t *info, void *ptr)
134272343Sngie{
135272343Sngie	if (info != NULL) {
136272343Sngie		printf("info=%p\n", info);
137272343Sngie		printf("ptr=%p\n", ptr);
138272343Sngie		printf("si_signo=%d\n", info->si_signo);
139272343Sngie		printf("si_errno=%d\n", info->si_errno);
140272343Sngie		printf("si_code=%d\n", info->si_code);
141272343Sngie		printf("si_uid=%d\n", info->si_uid);
142272343Sngie		printf("si_pid=%d\n", info->si_pid);
143272343Sngie		printf("si_status=%d\n", info->si_status);
144272343Sngie		printf("si_utime=%lu\n", (unsigned long int)info->si_utime);
145272343Sngie		printf("si_stime=%lu\n", (unsigned long int)info->si_stime);
146272343Sngie	}
147272343Sngie	ATF_REQUIRE_EQ(info->si_code, code);
148272343Sngie	ATF_REQUIRE_EQ(info->si_signo, SIGCHLD);
149272343Sngie	ATF_REQUIRE_EQ(info->si_uid, getuid());
150272343Sngie	ATF_REQUIRE_EQ(info->si_pid, child);
151272343Sngie	if (WIFEXITED(info->si_status))
152272343Sngie		ATF_REQUIRE_EQ(WEXITSTATUS(info->si_status), status);
153272343Sngie	else if (WIFSTOPPED(info->si_status))
154272343Sngie		ATF_REQUIRE_EQ(WSTOPSIG(info->si_status), status);
155272343Sngie	else if (WIFSIGNALED(info->si_status))
156272343Sngie		ATF_REQUIRE_EQ(WTERMSIG(info->si_status), status);
157272343Sngie}
158272343Sngie
159272343Sngiestatic void
160272343Sngiesetchildhandler(void (*action)(int, siginfo_t *, void *))
161272343Sngie{
162272343Sngie	struct sigaction sa;
163272343Sngie	sa.sa_flags = SA_SIGINFO;
164272343Sngie	sa.sa_sigaction = action;
165272343Sngie	sigemptyset(&sa.sa_mask);
166272343Sngie	sigaction(SIGCHLD, &sa, NULL);
167272343Sngie}
168272343Sngie
169272343Sngiestatic void
170272343Sngiesigchild_setup(void)
171272343Sngie{
172272343Sngie	sigset_t set;
173272343Sngie	struct rlimit rlim;
174272343Sngie
175272343Sngie	(void)getrlimit(RLIMIT_CORE, &rlim);
176272343Sngie	rlim.rlim_cur = rlim.rlim_max;
177272343Sngie	(void)setrlimit(RLIMIT_CORE, &rlim);
178272343Sngie
179272343Sngie	setchildhandler(sigchild_action);
180272343Sngie	sigemptyset(&set);
181272343Sngie	sigaddset(&set, SIGCHLD);
182272343Sngie	sigprocmask(SIG_BLOCK, &set, NULL);
183272343Sngie}
184272343Sngie
185272343SngieATF_TC(sigchild_normal);
186272343SngieATF_TC_HEAD(sigchild_normal, tc)
187272343Sngie{
188272343Sngie
189272343Sngie	atf_tc_set_md_var(tc, "descr",
190272343Sngie	    "Checks that signal trampoline correctly calls SIGCHLD handler "
191272343Sngie	    "when child exits normally");
192272343Sngie}
193272343Sngie
194272343SngieATF_TC_BODY(sigchild_normal, tc)
195272343Sngie{
196272343Sngie	sigset_t set;
197272343Sngie
198272343Sngie	sigchild_setup();
199272343Sngie
200272343Sngie	status = 25;
201272343Sngie	code = CLD_EXITED;
202272343Sngie
203272343Sngie	switch ((child = fork())) {
204272343Sngie	case 0:
205272343Sngie		sleep(1);
206272343Sngie		exit(status);
207272343Sngie	case -1:
208272343Sngie		atf_tc_fail("fork failed");
209272343Sngie	default:
210272343Sngie		sigemptyset(&set);
211272343Sngie		sigsuspend(&set);
212272343Sngie	}
213272343Sngie}
214272343Sngie
215272343SngieATF_TC(sigchild_dump);
216272343SngieATF_TC_HEAD(sigchild_dump, tc)
217272343Sngie{
218272343Sngie
219272343Sngie	atf_tc_set_md_var(tc, "descr",
220272343Sngie	    "Checks that signal trampoline correctly calls SIGCHLD handler "
221272343Sngie	    "when child segfaults");
222272343Sngie}
223272343Sngie
224272343SngieATF_TC_BODY(sigchild_dump, tc)
225272343Sngie{
226272343Sngie	sigset_t set;
227272343Sngie
228272343Sngie	sigchild_setup();
229272343Sngie
230272343Sngie	status = SIGSEGV;
231272343Sngie	code = CLD_DUMPED;
232272343Sngie
233272343Sngie	switch ((child = fork())) {
234272343Sngie	case 0:
235272343Sngie		sleep(1);
236272343Sngie		*(volatile long *)0 = 0;
237272343Sngie		atf_tc_fail("Child did not segfault");
238272343Sngie		/* NOTREACHED */
239272343Sngie	case -1:
240272343Sngie		atf_tc_fail("fork failed");
241272343Sngie	default:
242272343Sngie		sigemptyset(&set);
243272343Sngie		sigsuspend(&set);
244272343Sngie	}
245272343Sngie}
246272343Sngie
247272343SngieATF_TC(sigchild_kill);
248272343SngieATF_TC_HEAD(sigchild_kill, tc)
249272343Sngie{
250272343Sngie
251272343Sngie	atf_tc_set_md_var(tc, "descr",
252272343Sngie	    "Checks that signal trampoline correctly calls SIGCHLD handler "
253272343Sngie	    "when child is killed");
254272343Sngie}
255272343Sngie
256272343SngieATF_TC_BODY(sigchild_kill, tc)
257272343Sngie{
258272343Sngie	sigset_t set;
259272343Sngie
260272343Sngie	sigchild_setup();
261272343Sngie
262272343Sngie	status = SIGPIPE;
263272343Sngie	code = CLD_KILLED;
264272343Sngie
265272343Sngie	switch ((child = fork())) {
266272343Sngie	case 0:
267272343Sngie		sigemptyset(&set);
268272343Sngie		sigsuspend(&set);
269272343Sngie		break;
270272343Sngie	case -1:
271272343Sngie		atf_tc_fail("fork failed");
272272343Sngie	default:
273272343Sngie		kill(child, SIGPIPE);
274272343Sngie		sigemptyset(&set);
275272343Sngie		sigsuspend(&set);
276272343Sngie	}
277272343Sngie}
278272343Sngie
279272343Sngiestatic sigjmp_buf sigfpe_flt_env;
280272343Sngiestatic void
281272343Sngiesigfpe_flt_action(int signo, siginfo_t *info, void *ptr)
282272343Sngie{
283272343Sngie
284272343Sngie	sig_debug(signo, info, (ucontext_t *)ptr);
285272343Sngie
286272343Sngie	if (fltdiv_signalled++ != 0)
287272343Sngie		atf_tc_fail("FPE handler called more than once");
288272343Sngie
289272343Sngie	ATF_REQUIRE_EQ(info->si_signo, SIGFPE);
290272343Sngie	ATF_REQUIRE_EQ(info->si_code, FPE_FLTDIV);
291272343Sngie	ATF_REQUIRE_EQ(info->si_errno, 0);
292272343Sngie
293272343Sngie	siglongjmp(sigfpe_flt_env, 1);
294272343Sngie}
295272343Sngie
296272343SngieATF_TC(sigfpe_flt);
297272343SngieATF_TC_HEAD(sigfpe_flt, tc)
298272343Sngie{
299272343Sngie
300272343Sngie	atf_tc_set_md_var(tc, "descr",
301272343Sngie	    "Checks that signal trampoline correctly calls SIGFPE handler "
302272343Sngie	    "for floating div-by-zero");
303272343Sngie}
304272343Sngie
305272343SngieATF_TC_BODY(sigfpe_flt, tc)
306272343Sngie{
307272343Sngie	struct sigaction sa;
308272343Sngie	double d = strtod("0", NULL);
309272343Sngie
310272343Sngie	if (isQEMU())
311272343Sngie		atf_tc_skip("Test does not run correctly under QEMU");
312272343Sngie#if defined(__powerpc__)
313272343Sngie	atf_tc_skip("Test not valid on powerpc");
314272343Sngie#endif
315272343Sngie	if (sigsetjmp(sigfpe_flt_env, 0) == 0) {
316272343Sngie		sa.sa_flags = SA_SIGINFO;
317272343Sngie		sa.sa_sigaction = sigfpe_flt_action;
318272343Sngie		sigemptyset(&sa.sa_mask);
319272343Sngie		sigaction(SIGFPE, &sa, NULL);
320272343Sngie#ifdef HAVE_FENV
321272343Sngie		feenableexcept(FE_ALL_EXCEPT);
322272343Sngie#elif defined(_FLOAT_IEEE754)
323272343Sngie		fpsetmask(FP_X_INV|FP_X_DZ|FP_X_OFL|FP_X_UFL|FP_X_IMP);
324272343Sngie#endif
325272343Sngie		printf("%g\n", 1 / d);
326272343Sngie	}
327272343Sngie	if (fltdiv_signalled == 0)
328272343Sngie		atf_tc_fail("FPE signal handler was not invoked");
329272343Sngie}
330272343Sngie
331272343Sngiestatic sigjmp_buf sigfpe_int_env;
332272343Sngiestatic void
333272343Sngiesigfpe_int_action(int signo, siginfo_t *info, void *ptr)
334272343Sngie{
335272343Sngie
336272343Sngie	sig_debug(signo, info, (ucontext_t *)ptr);
337272343Sngie
338272343Sngie	if (intdiv_signalled++ != 0)
339272343Sngie		atf_tc_fail("INTDIV handler called more than once");
340272343Sngie
341272343Sngie	ATF_REQUIRE_EQ(info->si_signo, SIGFPE);
342272343Sngie	ATF_REQUIRE_EQ(info->si_code, FPE_INTDIV);
343272343Sngie	atf_tc_expect_pass();
344272343Sngie	ATF_REQUIRE_EQ(info->si_errno, 0);
345272343Sngie
346272343Sngie	siglongjmp(sigfpe_int_env, 1);
347272343Sngie}
348272343Sngie
349272343SngieATF_TC(sigfpe_int);
350272343SngieATF_TC_HEAD(sigfpe_int, tc)
351272343Sngie{
352272343Sngie
353272343Sngie	atf_tc_set_md_var(tc, "descr",
354272343Sngie	    "Checks that signal trampoline correctly calls SIGFPE handler "
355272343Sngie	    "for integer div-by-zero (PR port-i386/43655)");
356272343Sngie}
357272343Sngie
358272343SngieATF_TC_BODY(sigfpe_int, tc)
359272343Sngie{
360272343Sngie	struct sigaction sa;
361272343Sngie	long l = strtol("0", NULL, 10);
362272343Sngie
363272343Sngie#if defined(__powerpc__)
364272343Sngie	atf_tc_skip("Test not valid on powerpc");
365272343Sngie#endif
366272343Sngie	if (sigsetjmp(sigfpe_int_env, 0) == 0) {
367272343Sngie		sa.sa_flags = SA_SIGINFO;
368272343Sngie		sa.sa_sigaction = sigfpe_int_action;
369272343Sngie		sigemptyset(&sa.sa_mask);
370272343Sngie		sigaction(SIGFPE, &sa, NULL);
371272343Sngie#ifdef HAVE_FENV
372272343Sngie		feenableexcept(FE_ALL_EXCEPT);
373272343Sngie#elif defined(_FLOAT_IEEE754)
374272343Sngie		fpsetmask(FP_X_INV|FP_X_DZ|FP_X_OFL|FP_X_UFL|FP_X_IMP);
375272343Sngie#endif
376272343Sngie		printf("%ld\n", 1 / l);
377272343Sngie	}
378272343Sngie	if (intdiv_signalled == 0)
379272343Sngie		atf_tc_fail("FPE signal handler was not invoked");
380272343Sngie}
381272343Sngie
382272343Sngiestatic void
383272343Sngiesigsegv_action(int signo, siginfo_t *info, void *ptr)
384272343Sngie{
385272343Sngie
386272343Sngie	sig_debug(signo, info, (ucontext_t *)ptr);
387272343Sngie
388272343Sngie	ATF_REQUIRE_EQ(info->si_signo, SIGSEGV);
389272343Sngie	ATF_REQUIRE_EQ(info->si_errno, 0);
390272343Sngie	ATF_REQUIRE_EQ(info->si_code, SEGV_MAPERR);
391272343Sngie	ATF_REQUIRE_EQ(info->si_addr, (void *)0);
392272343Sngie
393272343Sngie	atf_tc_pass();
394272343Sngie	/* NOTREACHED */
395272343Sngie}
396272343Sngie
397272343SngieATF_TC(sigsegv);
398272343SngieATF_TC_HEAD(sigsegv, tc)
399272343Sngie{
400272343Sngie
401272343Sngie	atf_tc_set_md_var(tc, "descr",
402272343Sngie	    "Checks that signal trampoline correctly calls SIGSEGV handler");
403272343Sngie}
404272343Sngie
405272343SngieATF_TC_BODY(sigsegv, tc)
406272343Sngie{
407272343Sngie	struct sigaction sa;
408272343Sngie
409272343Sngie	sa.sa_flags = SA_SIGINFO;
410272343Sngie	sa.sa_sigaction = sigsegv_action;
411272343Sngie	sigemptyset(&sa.sa_mask);
412272343Sngie	sigaction(SIGSEGV, &sa, NULL);
413272343Sngie
414272343Sngie	*(volatile long *)0 = 0;
415272343Sngie	atf_tc_fail("Test did not fault as expected");
416272343Sngie}
417272343Sngie
418272343Sngiestatic void
419272343Sngiesigbus_action(int signo, siginfo_t *info, void *ptr)
420272343Sngie{
421272343Sngie
422272343Sngie	printf("si_addr = %p\n", info->si_addr);
423272343Sngie	sig_debug(signo, info, (ucontext_t *)ptr);
424272343Sngie
425272343Sngie	ATF_REQUIRE_EQ(info->si_signo, SIGBUS);
426272343Sngie	ATF_REQUIRE_EQ(info->si_errno, 0);
427272343Sngie	ATF_REQUIRE_EQ(info->si_code, BUS_ADRALN);
428272343Sngie
429272343Sngie#if defined(__i386__) || defined(__x86_64__)
430272343Sngie	atf_tc_expect_fail("x86 architecture does not correctly "
431272343Sngie	    "report the address where the unaligned access occured");
432272343Sngie#endif
433272343Sngie	ATF_REQUIRE_EQ(info->si_addr, (volatile void *)addr);
434272343Sngie
435272343Sngie	atf_tc_pass();
436272343Sngie	/* NOTREACHED */
437272343Sngie}
438272343Sngie
439272343SngieATF_TC(sigbus_adraln);
440272343SngieATF_TC_HEAD(sigbus_adraln, tc)
441272343Sngie{
442272343Sngie
443272343Sngie	atf_tc_set_md_var(tc, "descr",
444272343Sngie	    "Checks that signal trampoline correctly calls SIGBUS handler "
445272343Sngie	    "for invalid address alignment");
446272343Sngie}
447272343Sngie
448272343SngieATF_TC_BODY(sigbus_adraln, tc)
449272343Sngie{
450272343Sngie	struct sigaction sa;
451272343Sngie
452272343Sngie#if defined(__alpha__)
453272343Sngie	int rv, val;
454272343Sngie	size_t len = sizeof(val);
455272343Sngie	rv = sysctlbyname("machdep.unaligned_sigbus", &val, &len, NULL, 0);
456272343Sngie	ATF_REQUIRE(rv == 0);
457272343Sngie	if (val == 0)
458272343Sngie		atf_tc_skip("SIGBUS signal not enabled for unaligned accesses");
459272343Sngie#endif
460272343Sngie
461272343Sngie	sa.sa_flags = SA_SIGINFO;
462272343Sngie	sa.sa_sigaction = sigbus_action;
463272343Sngie	sigemptyset(&sa.sa_mask);
464272343Sngie	sigaction(SIGBUS, &sa, NULL);
465272343Sngie
466272343Sngie	/* Enable alignment checks for x86. 0x40000 is PSL_AC. */
467272343Sngie#if defined(__i386__)
468272343Sngie	__asm__("pushf; orl $0x40000, (%esp); popf");
469272343Sngie#elif defined(__amd64__)
470272343Sngie	__asm__("pushf; orl $0x40000, (%rsp); popf");
471272343Sngie#endif
472272343Sngie
473272343Sngie	addr = calloc(2, sizeof(int));
474272343Sngie	ATF_REQUIRE(addr != NULL);
475272343Sngie
476272343Sngie	if (isQEMU())
477272343Sngie		atf_tc_expect_fail("QEMU fails to trap unaligned accesses");
478272343Sngie
479272343Sngie	/* Force an unaligned access */
480272343Sngie	addr++;
481272343Sngie	printf("now trying to access unaligned address %p\n", addr);
482272343Sngie	ATF_REQUIRE_EQ(*(volatile int *)addr, 0);
483272343Sngie
484272343Sngie	atf_tc_fail("Test did not fault as expected");
485272343Sngie}
486272343Sngie
487272343SngieATF_TP_ADD_TCS(tp)
488272343Sngie{
489272343Sngie
490272343Sngie	ATF_TP_ADD_TC(tp, sigalarm);
491272343Sngie	ATF_TP_ADD_TC(tp, sigchild_normal);
492272343Sngie	ATF_TP_ADD_TC(tp, sigchild_dump);
493272343Sngie	ATF_TP_ADD_TC(tp, sigchild_kill);
494272343Sngie	ATF_TP_ADD_TC(tp, sigfpe_flt);
495272343Sngie	ATF_TP_ADD_TC(tp, sigfpe_int);
496272343Sngie	ATF_TP_ADD_TC(tp, sigsegv);
497272343Sngie	ATF_TP_ADD_TC(tp, sigbus_adraln);
498272343Sngie
499272343Sngie	return atf_no_error();
500272343Sngie}
501