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/fpu.c | 51 +++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/regress/lib/libc/setjmp-fpu/fpu.c (limited to 'src/regress/lib/libc/setjmp-fpu/fpu.c') 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); +} -- cgit v1.2.3-55-g6feb