summaryrefslogtreecommitdiff
path: root/lib/libc/softfloat/softfloat-specialize
diff options
context:
space:
mode:
authormartin <martin@NetBSD.org>2011-03-04 11:48:58 +0000
committermartin <martin@NetBSD.org>2011-03-04 11:48:58 +0000
commitae7817c0c5d79a234bbff115e1c66d0a78dc57b8 (patch)
treecc1df4ae74da14e2978fd49b95cca6c57432489f /lib/libc/softfloat/softfloat-specialize
parentdd01afbb192f92be75bec11e13c887ef9adbba62 (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-specialize21
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);
}
}