diff options
| author | martin <martin@NetBSD.org> | 2011-03-04 11:48:58 +0000 |
|---|---|---|
| committer | martin <martin@NetBSD.org> | 2011-03-04 11:48:58 +0000 |
| commit | ae7817c0c5d79a234bbff115e1c66d0a78dc57b8 (patch) | |
| tree | cc1df4ae74da14e2978fd49b95cca6c57432489f /lib/libc/softfloat/softfloat-specialize | |
| parent | dd01afbb192f92be75bec11e13c887ef9adbba62 (diff) | |
Use sigqueueinfo() instead of raise() to generate exceptions. Provide
minimalistic siginfo data.
Diffstat (limited to 'lib/libc/softfloat/softfloat-specialize')
| -rw-r--r-- | lib/libc/softfloat/softfloat-specialize | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/lib/libc/softfloat/softfloat-specialize b/lib/libc/softfloat/softfloat-specialize index b9853e4670c..3da15c462e2 100644 --- a/lib/libc/softfloat/softfloat-specialize +++ b/lib/libc/softfloat/softfloat-specialize @@ -1,4 +1,4 @@ -/* $NetBSD: softfloat-specialize,v 1.4 2004/09/26 21:13:27 jmmv Exp $ */ +/* $NetBSD: softfloat-specialize,v 1.5 2011/03/04 11:48:58 martin Exp $ */ /* This is a derivative work. */ @@ -33,6 +33,8 @@ this code that are retained. */ #include <signal.h> +#include <string.h> +#include <unistd.h> /* ------------------------------------------------------------------------------- @@ -56,11 +58,26 @@ should be simply `float_exception_flags |= flags;'. fp_except float_exception_mask = 0; void float_raise( fp_except flags ) { + siginfo_t info; float_exception_flags |= flags; if ( flags & float_exception_mask ) { - raise( SIGFPE ); + memset(&info, 0, sizeof info); + info.si_signo = SIGFPE; + info.si_pid = getpid(); + info.si_uid = geteuid(); + if (flags & float_flag_underflow) + info.si_code = FPE_FLTUND; + else if (flags & float_flag_overflow) + info.si_code = FPE_FLTOVF; + else if (flags & float_flag_divbyzero) + info.si_code = FPE_FLTDIV; + else if (flags & float_flag_invalid) + info.si_code = FPE_FLTINV; + else if (flags & float_flag_inexact) + info.si_code = FPE_FLTRES; + sigqueueinfo(getpid(), &info); } } |
