amull@Morgan.COM (Andrew P. Mullhaupt) (03/24/90)
On SCO UNIX System V/386 R3.2: I need to preserve the state of the floating point exception mask across an exec(). Experiments show that the exception mask and the sticky bit status seems to be preserved across fork() (i.e. is inherited by a child) but when exec is invoked, the exceptions may change. This has ummm - 'unpleasant' consequences. Note that it is not sufficient to work at the level of SIGFPE, but it is actually required to specify the floating point exception mask and sticky bit status to different values than the (otherwise sensible) defaults. Any ideas? Later, Andrew Mullhaupt
jsalter@slo.uucp (James Salter) (03/25/90)
In article <795@s7.Morgan.COM> amull@Morgan.COM (Andrew P. Mullhaupt) writes: > > On SCO UNIX System V/386 R3.2: > >I need to preserve the state of the floating point exception mask >across an exec(). Experiments show that the exception mask and the >sticky bit status seems to be preserved across fork() (i.e. is >inherited by a child) but when exec is invoked, the exceptions may >change. This has ummm - 'unpleasant' consequences. Note that it >is not sufficient to work at the level of SIGFPE, but it is actually >required to specify the floating point exception mask and sticky bit >status to different values than the (otherwise sensible) defaults. You mean apart from rewriting the exec() function? :-) Realistically, the only way you could preserve the state is through a save mechanism before the exec() and a restore after the exec(). In the System V/386 3.2 programmer's reference manual I have, it lists some routines under FPGETROUND(3C). Including the functions: fpgetmask(), fpsetmask(), fpgetsticky(), fpsetsticky() and the include file: #include <ieeefp.h> I don't know what SCO version does... To do your own such routines, it would require some machine coding and use of at least a short int to save just the status word. If you require the status AND the control word to be saved, just store it into a long int and do some byte shifting. Or use two shorts if you're lazy... >Andrew Mullhaupt jim/jsalter IBM AWD T465/(415)855-4427 VNET: JSALTER at PALOALTO UUCP: ..!uunet!ibmsupt!jsalter Disc: Any opinions are mine. IP: ibmsupt!jsalter@uunet.uu.net "PS/2 it, or DIE!"
jeff@samna.UUCP (jeff) (03/27/90)
In article <795@s7.Morgan.COM> amull@Morgan.COM (Andrew P. Mullhaupt) writes: >I need to preserve the state of the floating point exception mask >across an exec(). Experiments show that the exception mask and the >sticky bit status seems to be preserved across fork() (i.e. is >inherited by a child) but when exec is invoked, the exceptions may >change. This has ummm - 'unpleasant' consequences. Note that it >is not sufficient to work at the level of SIGFPE, but it is actually >required to specify the floating point exception mask and sticky bit >status to different values than the (otherwise sensible) defaults. Hmm, I'm fairly sure that the "sticky bit" ordinarily refers to the bit in the file permissions which causes an executable to hang around in the swap space even when it's not in use. I don't think anyone would want this inherited across an exec (Imagine putting the sticky bit on your shell and having it inherited across exec's - pretty soon you'd run out of swap as every single program in /bin, /usr/bin, /usr/ucb, etc. gets sucked into swap). I think you're referring to something other than the sticky bit. As for the exception mask, I think it's only fair to a process being exec'd that it know that the floating point chip is in some reasonably well-defined state when it begins execution - I'd suspect that's why it's being re-initialized. If you really need the exception mask to be set a certain way, why not pass the state to the new process as an argument and let the new process set the exception mask to the desired value. Jeff