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); } }