Module Name: src Committed By: martin Date: Sat Jan 26 16:44:30 UTC 2019
Modified Files: src/tests/kernel: h_segv.c t_trapsignal.sh Log Message: Some arm CPUs do not implement traps on floating point exceptions. To generate a diff of this commit: cvs rdiff -u -r1.10 -r1.11 src/tests/kernel/h_segv.c cvs rdiff -u -r1.4 -r1.5 src/tests/kernel/t_trapsignal.sh Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/kernel/h_segv.c diff -u src/tests/kernel/h_segv.c:1.10 src/tests/kernel/h_segv.c:1.11 --- src/tests/kernel/h_segv.c:1.10 Mon Nov 12 05:02:00 2018 +++ src/tests/kernel/h_segv.c Sat Jan 26 16:44:30 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: h_segv.c,v 1.10 2018/11/12 05:02:00 riastradh Exp $ */ +/* $NetBSD: h_segv.c,v 1.11 2019/01/26 16:44:30 martin Exp $ */ /*- * Copyright (c) 2017 The NetBSD Foundation, Inc. @@ -29,7 +29,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__RCSID("$NetBSD: h_segv.c,v 1.10 2018/11/12 05:02:00 riastradh Exp $"); +__RCSID("$NetBSD: h_segv.c,v 1.11 2019/01/26 16:44:30 martin Exp $"); #define __TEST_FENV @@ -39,6 +39,7 @@ __RCSID("$NetBSD: h_segv.c,v 1.10 2018/1 #include <err.h> #include <fenv.h> +#include <ieeefp.h> /* only need for ARM Cortex/Neon hack */ #include <signal.h> #include <stdio.h> #include <stdlib.h> @@ -50,6 +51,7 @@ static int flags; #define F_HANDLE 2 #define F_MASK 4 #define F_IGNORE 8 +#define F_CHECK 16 static struct { const char *n; @@ -58,7 +60,8 @@ static struct { { "recurse", F_RECURSE }, { "handle", F_HANDLE }, { "mask", F_MASK }, - { "ignore", F_IGNORE } + { "ignore", F_IGNORE }, + { "check", F_CHECK } }; static int sig; @@ -104,6 +107,23 @@ trigger_ill(void) } static void +check_fpe(void) +{ +#if (__arm__ && !__SOFTFP__) || __aarch64__ + /* + * Some NEON fpus do not implement IEEE exception handling, + * skip these tests if running on them and compiled for + * hard float. + */ + if (0 == fpsetmask(fpsetmask(FP_X_INV))) { + printf("FPU does not implement exception handling\n"); + exit(EXIT_FAILURE); + } +#endif + exit(EXIT_SUCCESS); +} + +static void trigger_fpe(void) { volatile double a = getpid(); @@ -185,7 +205,7 @@ usage(void) const char *pname = getprogname(); fprintf(stderr, "Usage: %s segv|trap|ill|fpe|bus " - "[recurse|mask|handle|ignore] ...\n", pname); + "[recurse|mask|handle|ignore|check] ...\n", pname); exit(EXIT_FAILURE); } @@ -221,6 +241,13 @@ main(int argc, char *argv[]) if (flags == 0 || sig == 0) usage(); + if (flags & F_CHECK && sig != SIGFPE) { + fprintf(stderr, "can only check for fpe support\n"); + return 1; + } + if (flags & F_CHECK) + check_fpe(); + if (flags & F_HANDLE) { struct sigaction sa; Index: src/tests/kernel/t_trapsignal.sh diff -u src/tests/kernel/t_trapsignal.sh:1.4 src/tests/kernel/t_trapsignal.sh:1.5 --- src/tests/kernel/t_trapsignal.sh:1.4 Sun May 27 17:04:45 2018 +++ src/tests/kernel/t_trapsignal.sh Sat Jan 26 16:44:30 2019 @@ -1,4 +1,4 @@ -# $NetBSD: t_trapsignal.sh,v 1.4 2018/05/27 17:04:45 kamil Exp $ +# $NetBSD: t_trapsignal.sh,v 1.5 2019/01/26 16:44:30 martin Exp $ # # Copyright (c) 2017 The NetBSD Foundation, Inc. # All rights reserved. @@ -172,6 +172,18 @@ trap_ignore_body() # SIGFPE +fpe_available() +{ + if ${HELPER} fpe check > msg.$$ + then + rm -f msg.$$ + else + msg=$( cat msg.$$ ) + rm -f msg.$$ + atf_skip "$msg" + fi +} + atf_test_case fpe_simple fpe_simple() { @@ -179,6 +191,7 @@ fpe_simple() } fpe_simple_body() { + fpe_available atf_check -s signal:8 -o "inline:" -e "inline:" \ ${HELPER} fpe recurse } @@ -190,6 +203,7 @@ fpe_handle() } fpe_handle_body() { + fpe_available atf_check -s exit:0 -o "inline:" -e "inline:got 8\n" \ ${HELPER} fpe handle } @@ -201,6 +215,7 @@ fpe_mask() } fpe_mask_body() { + fpe_available atf_check -s signal:8 -o "inline:" -e "inline:" \ ${HELPER} fpe mask } @@ -212,6 +227,7 @@ fpe_handle_mask() } fpe_handle_mask_body() { + fpe_available atf_check -s signal:8 -o "inline:" -e "inline:" \ ${HELPER} fpe mask handle } @@ -224,6 +240,7 @@ fpe_handle_recurse() fpe_handle_recurse_body() { + fpe_available atf_check -s signal:8 -o "inline:" -e "inline:got 8\n" \ ${HELPER} fpe handle recurse } @@ -236,6 +253,7 @@ fpe_ignore() fpe_ignore_body() { + fpe_available atf_check -s signal:8 -o "inline:" -e "inline:" \ ${HELPER} fpe ignore }