Module Name: src
Committed By: kamil
Date: Thu Apr 25 19:15:23 UTC 2019
Modified Files:
src/tests/lib/libc/sys: Makefile t_ptrace_wait.c t_ptrace_wait.h
Log Message:
Introduce check for the support of FPU exceptions
If FPU exceptions are unsupported, skip the SIGFPE crash tests.
Reuse code from tests/kernel/h_segv.c
To generate a diff of this commit:
cvs rdiff -u -r1.54 -r1.55 src/tests/lib/libc/sys/Makefile
cvs rdiff -u -r1.113 -r1.114 src/tests/lib/libc/sys/t_ptrace_wait.c
cvs rdiff -u -r1.15 -r1.16 src/tests/lib/libc/sys/t_ptrace_wait.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/tests/lib/libc/sys/Makefile
diff -u src/tests/lib/libc/sys/Makefile:1.54 src/tests/lib/libc/sys/Makefile:1.55
--- src/tests/lib/libc/sys/Makefile:1.54 Sun Feb 10 02:13:45 2019
+++ src/tests/lib/libc/sys/Makefile Thu Apr 25 19:15:23 2019
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.54 2019/02/10 02:13:45 kamil Exp $
+# $NetBSD: Makefile,v 1.55 2019/04/25 19:15:23 kamil Exp $
MKMAN= no
@@ -88,12 +88,12 @@ SRCS.t_mprotect= t_mprotect.c ${SRCS_EXE
LDADD.t_getpid+= -lpthread
-LDFLAGS.t_ptrace_wait+= -pthread
-LDFLAGS.t_ptrace_wait3+= -pthread
-LDFLAGS.t_ptrace_wait4+= -pthread
-LDFLAGS.t_ptrace_wait6+= -pthread
-LDFLAGS.t_ptrace_waitid+= -pthread
-LDFLAGS.t_ptrace_waitpid+= -pthread
+LDFLAGS.t_ptrace_wait+= -pthread -lm
+LDFLAGS.t_ptrace_wait3+= -pthread -lm
+LDFLAGS.t_ptrace_wait4+= -pthread -lm
+LDFLAGS.t_ptrace_wait6+= -pthread -lm
+LDFLAGS.t_ptrace_waitid+= -pthread -lm
+LDFLAGS.t_ptrace_waitpid+= -pthread -lm
.if (${MKRUMP} != "no") && !defined(BSD_MK_COMPAT_FILE)
CPPFLAGS.t_posix_fadvise.c += -D_KERNTYPES
@@ -102,12 +102,12 @@ LDADD.t_posix_fadvise+= -lrumpvfs -lrump
.endif
CPPFLAGS.t_lwp_create.c += -D_KERNTYPES
-CPPFLAGS.t_ptrace_wait.c += -D_KERNTYPES
-CPPFLAGS.t_ptrace_wait3.c += -D_KERNTYPES
-CPPFLAGS.t_ptrace_wait4.c += -D_KERNTYPES
-CPPFLAGS.t_ptrace_wait6.c += -D_KERNTYPES
-CPPFLAGS.t_ptrace_waitid.c += -D_KERNTYPES
-CPPFLAGS.t_ptrace_waitpid.c += -D_KERNTYPES
+CPPFLAGS.t_ptrace_wait.c += -D_KERNTYPES -D__TEST_FENV
+CPPFLAGS.t_ptrace_wait3.c += -D_KERNTYPES -D__TEST_FENV
+CPPFLAGS.t_ptrace_wait4.c += -D_KERNTYPES -D__TEST_FENV
+CPPFLAGS.t_ptrace_wait6.c += -D_KERNTYPES -D__TEST_FENV
+CPPFLAGS.t_ptrace_waitid.c += -D_KERNTYPES -D__TEST_FENV
+CPPFLAGS.t_ptrace_waitpid.c += -D_KERNTYPES -D__TEST_FENV
CPPFLAGS.t_ucontext.c += -D_KERNTYPES
FILES= truncate_test.root_owned
Index: src/tests/lib/libc/sys/t_ptrace_wait.c
diff -u src/tests/lib/libc/sys/t_ptrace_wait.c:1.113 src/tests/lib/libc/sys/t_ptrace_wait.c:1.114
--- src/tests/lib/libc/sys/t_ptrace_wait.c:1.113 Thu Apr 25 11:47:59 2019
+++ src/tests/lib/libc/sys/t_ptrace_wait.c Thu Apr 25 19:15:23 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: t_ptrace_wait.c,v 1.113 2019/04/25 11:47:59 kamil Exp $ */
+/* $NetBSD: t_ptrace_wait.c,v 1.114 2019/04/25 19:15:23 kamil Exp $ */
/*-
* Copyright (c) 2016, 2017, 2018, 2019 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_ptrace_wait.c,v 1.113 2019/04/25 11:47:59 kamil Exp $");
+__RCSID("$NetBSD: t_ptrace_wait.c,v 1.114 2019/04/25 19:15:23 kamil Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -53,6 +53,11 @@ __RCSID("$NetBSD: t_ptrace_wait.c,v 1.11
#include <time.h>
#include <unistd.h>
+#include <fenv.h>
+#if (__arm__ && !__SOFTFP__) || __aarch64__
+#include <ieeefp.h> /* only need for ARM Cortex/Neon hack */
+#endif
+
#include <atf-c.h>
#include "h_macros.h"
@@ -413,6 +418,9 @@ traceme_crash(int sig)
atf_tc_skip("PTRACE_ILLEGAL_ASM not defined");
#endif
+ if (sig == SIGFPE && !are_fpu_exceptions_supported())
+ atf_tc_skip("FP exceptions are not supported");
+
memset(&info, 0, sizeof(info));
DPRINTF("Before forking process PID=%d\n", getpid());
@@ -537,6 +545,9 @@ traceme_signalmasked_crash(int sig)
atf_tc_skip("PTRACE_ILLEGAL_ASM not defined");
#endif
+ if (sig == SIGFPE && !are_fpu_exceptions_supported())
+ atf_tc_skip("FP exceptions are not supported");
+
memset(&info, 0, sizeof(info));
DPRINTF("Before forking process PID=%d\n", getpid());
@@ -715,6 +726,9 @@ traceme_signalignored_crash(int sig)
atf_tc_skip("PTRACE_ILLEGAL_ASM not defined");
#endif
+ if (sig == SIGFPE && !are_fpu_exceptions_supported())
+ atf_tc_skip("FP exceptions are not supported");
+
memset(&info, 0, sizeof(info));
DPRINTF("Before forking process PID=%d\n", getpid());
@@ -1523,6 +1537,9 @@ traceme_vfork_crash(int sig)
atf_tc_skip("PTRACE_ILLEGAL_ASM not defined");
#endif
+ if (sig == SIGFPE && !are_fpu_exceptions_supported())
+ atf_tc_skip("FP exceptions are not supported");
+
DPRINTF("Before forking process PID=%d\n", getpid());
SYSCALL_REQUIRE((child = vfork()) != -1);
if (child == 0) {
@@ -1602,6 +1619,9 @@ traceme_vfork_signalmasked_crash(int sig
atf_tc_skip("PTRACE_ILLEGAL_ASM not defined");
#endif
+ if (sig == SIGFPE && !are_fpu_exceptions_supported())
+ atf_tc_skip("FP exceptions are not supported");
+
DPRINTF("Before forking process PID=%d\n", getpid());
SYSCALL_REQUIRE((child = vfork()) != -1);
if (child == 0) {
@@ -1685,6 +1705,9 @@ traceme_vfork_signalignored_crash(int si
atf_tc_skip("PTRACE_ILLEGAL_ASM not defined");
#endif
+ if (sig == SIGFPE && !are_fpu_exceptions_supported())
+ atf_tc_skip("FP exceptions are not supported");
+
DPRINTF("Before forking process PID=%d\n", getpid());
SYSCALL_REQUIRE((child = vfork()) != -1);
if (child == 0) {
@@ -1936,6 +1959,9 @@ unrelated_tracer_sees_crash(int sig, boo
atf_tc_skip("PTRACE_ILLEGAL_ASM not defined");
#endif
+ if (sig == SIGFPE && !are_fpu_exceptions_supported())
+ atf_tc_skip("FP exceptions are not supported");
+
memset(&info, 0, sizeof(info));
DPRINTF("Spawn tracee\n");
Index: src/tests/lib/libc/sys/t_ptrace_wait.h
diff -u src/tests/lib/libc/sys/t_ptrace_wait.h:1.15 src/tests/lib/libc/sys/t_ptrace_wait.h:1.16
--- src/tests/lib/libc/sys/t_ptrace_wait.h:1.15 Thu Apr 11 20:20:54 2019
+++ src/tests/lib/libc/sys/t_ptrace_wait.h Thu Apr 25 19:15:23 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: t_ptrace_wait.h,v 1.15 2019/04/11 20:20:54 kamil Exp $ */
+/* $NetBSD: t_ptrace_wait.h,v 1.16 2019/04/25 19:15:23 kamil Exp $ */
/*-
* Copyright (c) 2016, 2017, 2018, 2019 The NetBSD Foundation, Inc.
@@ -602,12 +602,31 @@ trigger_ill(void)
#endif
}
+static bool __used
+are_fpu_exceptions_supported(void)
+{
+#if (__arm__ && !__SOFTFP__) || __aarch64__
+ /*
+ * Some NEON fpus do not trap on IEEE 754 FP exceptions.
+ * Skip these tests if running on them and compiled for
+ * hard float.
+ */
+ if (0 == fpsetmask(fpsetmask(FP_X_INV)))
+ return false;
+#endif
+ return true;
+}
+
static void __used
trigger_fpe(void)
{
volatile int a = getpid();
volatile int b = atoi("0");
+#ifdef __HAVE_FENV
+ feenableexcept(FE_ALL_EXCEPT);
+#endif
+
/* Division by zero causes CPU trap, translated to SIGFPE */
usleep(a / b);
}