Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 3 Feb 1998 09:19:34 -0800 (PST)
From:      Thomas Dean <tomdean@ix.netcom.com>
To:        malte@webmore.com
Cc:        bartol@salk.edu, questions@FreeBSD.ORG
Subject:   Re: IEEE Floating Point question: Inf and NaN
Message-ID:  <199802031719.JAA00500@ix.netcom.com>
In-Reply-To: <3.0.32.19980203083924.02fad158@cyclone.degnet.baynet.de> (message from Malte Lance on Tue, 03 Feb 1998 08:39:25 -0100)

next in thread | previous in thread | raw e-mail | index | archive | help
Catching exceptions with a signal handler does not work in FreeBSD.
The exception mask is cleared BEFORE the user signal handler is called.
In npx.c,

...
 *
 * XXX the FP state is not preserved across signal handlers.  So signal
 * handlers cannot afford to do FP unless they preserve the state or
 * longjmp() out.  Both preserving the state and longjmp()ing may be
 * destroyed by IRQ13 bugs.  Clearing FP exceptions is not an acceptable
 * solution for signals other than SIGFPE.
 */
void    
npxintr(unit)   
        int unit;
{       
        int code;
        struct intrframe *frame;
        
        if (npxproc == NULL || !npx_exists) { 
              printf("npxintr: npxproc = %p, curproc = %p, npx_exists = %d\n",
                       npxproc, curproc, npx_exists);
              panic("npxintr from nowhere");
        }
        if (npxproc != curproc) {
              printf("npxintr: npxproc = %p, curproc = %p, npx_exists = %d\n",
                       npxproc, curproc, npx_exists);
              panic("npxintr from non-current process");
        }

        outb(0xf0, 0);
        fnstsw(&curpcb->pcb_savefpu.sv_ex_sw);
===>    fnclex();
        fnop();
   
        /*
         * Pass exception to process.
         */
...

So, for the user process to handle exceptions, you must access
curpcb->pcb_savefpu.sv_ex_sw, or modify npx.c to not clear the
exception.  I do not think this is a problem with 486+ machines.  Can
this be prevented by using the definition of 'cpu' in the config file?
If we have 'cpu "I386_CPU"', then compile the fnclex(), otherwise do
not compile fnclex().

#if defined(I386_CPU)
        fnclex(); 
#endif



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199802031719.JAA00500>