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