Date: Thu, 9 May 1996 12:47:19 +1000 From: Bruce Evans <bde@zeta.org.au> To: alk@Think.COM, hackers@freebsd.org Subject: Re: SIGFPE Message-ID: <199605090247.MAA03905@godzilla.zeta.org.au>
next in thread | raw e-mail | index | archive | help
>Does anyone have an example of code which handles SIGFPEs? >I do not understand how to discriminate causes and rectify >problems in a handler, and there does not appear to be any >code in the os which does this, to serve as an example. It's not supported. The best method of handling a SIGFPE is: sig_atomic_t saw_sigfpe; jmp_buf sigfpe_jb; void sigfpe_handler(int s) { saw_sigfpe = 1; longjmp(sigfpe_jb, 1); } Use of floating point in a signal handler (not just the SIGFPE handler) gives undefined behaviour (in FreeBSD-current it trashes the FPU state and may cause a SIGFPE). Something like the following might work in FreeBSD-current. Signal handlers see the process' FPU state directly, so it is easy to change it directly if you know what to change. static struct save87 fpu_state; void sigfpe_handler(int s, int code, struct sigcontext *scp) { switch (code) { case FPE_INTDIV_TRAP: ... break; ... other integer traps ... case 0: /* XXX code for all h/w FP traps. Emulators may be different. */ asm("fnsave _fpu_state"); /* XXX */ fpu_state.sv_ex_sw = ptrace_or_something_to_read_saved_exception_status_from_user_area(); code = decode(fpu_state.sv_ex_sw); ... adjust fpu_state ... asm("frstor _fpu_state"); /* XXX */ break; } Bruce
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199605090247.MAA03905>