Module Name:    src
Committed By:   martin
Date:           Fri Mar  4 11:48:58 UTC 2011

Modified Files:
        src/lib/libc/softfloat: softfloat-specialize

Log Message:
Use sigqueueinfo() instead of raise() to generate exceptions. Provide
minimalistic siginfo data.


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/lib/libc/softfloat/softfloat-specialize

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libc/softfloat/softfloat-specialize
diff -u src/lib/libc/softfloat/softfloat-specialize:1.4 src/lib/libc/softfloat/softfloat-specialize:1.5
--- src/lib/libc/softfloat/softfloat-specialize:1.4	Sun Sep 26 21:13:27 2004
+++ src/lib/libc/softfloat/softfloat-specialize	Fri Mar  4 11:48:58 2011
@@ -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 @@
 */
 
 #include <signal.h>
+#include <string.h>
+#include <unistd.h>
 
 /*
 -------------------------------------------------------------------------------
@@ -56,11 +58,26 @@
 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);
     }
 }
 

Reply via email to