From 8fad58f293c47140f9e2a70b547e55d3040596cc Mon Sep 17 00:00:00 2001 From: bluhm <> Date: Thu, 16 Jan 2020 13:04:02 +0000 Subject: Check fpu functions without setjmp/longjmp before testing the latter. Use exit code 2 for setup failure and 1 for test fail. Unfortunately this regress is still failing. --- src/regress/lib/libc/setjmp-fpu/Makefile | 12 +++++-- src/regress/lib/libc/setjmp-fpu/fpu.c | 51 ++++++++++++++++++++++++++++ src/regress/lib/libc/setjmp-fpu/setjmp-fpu.c | 21 ++++++------ 3 files changed, 71 insertions(+), 13 deletions(-) create mode 100644 src/regress/lib/libc/setjmp-fpu/fpu.c diff --git a/src/regress/lib/libc/setjmp-fpu/Makefile b/src/regress/lib/libc/setjmp-fpu/Makefile index 7b9fae5f5f..c4e7196c1d 100644 --- a/src/regress/lib/libc/setjmp-fpu/Makefile +++ b/src/regress/lib/libc/setjmp-fpu/Makefile @@ -1,10 +1,16 @@ -# $OpenBSD: Makefile,v 1.3 2020/01/13 14:58:38 bluhm Exp $ +# $OpenBSD: Makefile,v 1.4 2020/01/16 13:03:42 bluhm Exp $ -PROGS= _setjmp setjmp sigsetjmp +PROGS= fpu _setjmp setjmp sigsetjmp LDADD= -lm -.for p in ${PROGS} +REGRESS_TARGETS = run-fpu +run-fpu: fpu + @echo '======== $@ ========' + # check fpu functions without setjmp/longjmp before testing the latter + ./fpu + +.for p in ${PROGS:M*jmp} REGRESS_TARGETS += run-$p run-$p: $p @echo '======== $@ ========' diff --git a/src/regress/lib/libc/setjmp-fpu/fpu.c b/src/regress/lib/libc/setjmp-fpu/fpu.c new file mode 100644 index 0000000000..fbfc85a8ef --- /dev/null +++ b/src/regress/lib/libc/setjmp-fpu/fpu.c @@ -0,0 +1,51 @@ +/* $OpenBSD: fpu.c,v 1.1 2020/01/16 13:04:02 bluhm Exp $ */ + +#include +#include +#include + +int +main(int argc, char *argv[]) +{ + fexcept_t flag; + int rv; + + /* Set up the FPU control word register. */ + rv = fesetround(FE_UPWARD); + if (rv != 0) + errx(2, "fesetround FE_UPWARD returned %d", rv); + fedisableexcept(FE_ALL_EXCEPT); + feenableexcept(FE_DIVBYZERO); + + /* Set the FPU exception flags. */ + flag = FE_OVERFLOW; + rv = fesetexceptflag(&flag, FE_ALL_EXCEPT); + if (rv != 0) + errx(2, "fesetexceptflag returned %d", rv); + + /* Schedule another process, to check if kernel preserves state. */ + rv = system("true"); + if (rv == -1) + err(2, "system"); + if (rv != 0) + errx(2, "true: %d", rv); + + /* Verify that the FPU control word is preserved. */ + rv = fegetround(); + if (rv != FE_UPWARD) + errx(1, "fegetround returned %d, not FE_UPWARD", rv); + rv = fegetexcept(); + if (rv != FE_DIVBYZERO) + errx(1, "fegetexcept returned %d, not FE_DIVBYZERO", + rv); + + /* Verify that the FPU exception flags weren't clobbered. */ + flag = 0; + rv = fegetexceptflag(&flag, FE_ALL_EXCEPT); + if (rv != 0) + errx(2, "fegetexceptflag returned %d", rv); + if (flag != FE_OVERFLOW) + errx(1, "except flag is %d, no FE_OVERFLOW", rv); + + return (0); +} diff --git a/src/regress/lib/libc/setjmp-fpu/setjmp-fpu.c b/src/regress/lib/libc/setjmp-fpu/setjmp-fpu.c index 11d616ae71..3cdf906e97 100644 --- a/src/regress/lib/libc/setjmp-fpu/setjmp-fpu.c +++ b/src/regress/lib/libc/setjmp-fpu/setjmp-fpu.c @@ -1,3 +1,5 @@ +/* $OpenBSD: setjmp-fpu.c,v 1.5 2020/01/16 13:04:02 bluhm Exp $ */ + #include #include #include @@ -6,12 +8,13 @@ int TEST_SETJMP(void) { JMP_BUF env; + fexcept_t flag; int rv; /* Set up the FPU control word register. */ rv = fesetround(FE_UPWARD); if (rv != 0) - errx(1, "fesetround FE_UPWARD returned %d", rv); + errx(2, "fesetround FE_UPWARD returned %d", rv); fedisableexcept(FE_ALL_EXCEPT); feenableexcept(FE_DIVBYZERO); @@ -19,25 +22,22 @@ TEST_SETJMP(void) switch(rv) { case 0: { - fexcept_t flag = FE_OVERFLOW; - /* Mess with the FPU control word. */ rv = fesetround(FE_DOWNWARD); if (rv != 0) - errx(1, "fesetround FE_DOWNWARD returned %d", rv); + errx(2, "fesetround FE_DOWNWARD returned %d", rv); fedisableexcept(FE_DIVBYZERO); /* Set the FPU exception flags. */ + flag = FE_OVERFLOW; rv = fesetexceptflag(&flag, FE_ALL_EXCEPT); if (rv != 0) - errx(1, "fesetexceptflag returned %d", rv); + errx(2, "fesetexceptflag returned %d", rv); LONGJMP(env, 1); - errx(1, "longjmp returned"); + errx(2, "longjmp returned"); } case 1: { - fexcept_t flag = 0; - /* Verify that the FPU control word is preserved. */ rv = fegetround(); if (rv != FE_UPWARD) @@ -48,15 +48,16 @@ TEST_SETJMP(void) rv); /* Verify that the FPU exception flags weren't clobbered. */ + flag = 0; rv = fegetexceptflag(&flag, FE_ALL_EXCEPT); if (rv != 0) - errx(1, "fegetexceptflag returned %d", rv); + errx(2, "fegetexceptflag returned %d", rv); if (flag != FE_OVERFLOW) errx(1, "except flag is %d, no FE_OVERFLOW", rv); return (0); } default: - errx(1, "setjmp returned %d", rv); + errx(2, "setjmp returned %d", rv); } } -- cgit v1.2.3-55-g6feb