ieee_handler(3BSD) (BSD System Compatibility) ieee_handler(3BSD)
NAME
ieee_handler - (BSD) IEEE exception trap handler function
SYNOPSIS
/usr/ucb/cc [flag . . . ] file . . .
#include <fp.h>
int ieee_handler(char action[], char exception[],
sigfpe_handler_type hdl);
DESCRIPTION
This function provides easy exception handling to exploit
ANSI/IEEE Std 754-1985 arithmetic in a C program. All
arguments are pointers to strings. Results arising from
invalid arguments and invalid combinations are undefined for
efficiency.
There are three types of action : get, set, and clear. There
are five types of exception:
inexact
division division by zero exception
underflow
overflow
invalid
all all five exceptions above
common invalid, overflow, and division exceptions
Note: all and common only make sense with set or clear
hdl contains the address of a signal-handling routine. fp.h
defines sigfpe_handler_type.
get will get the location of the current handler routine for
exception in hdl . set will set the routine pointed at by hdl
to be the handler routine and at the same time enable the trap
on exception, except when hdl == SIGFPE_DEFAULT or
SIGFPE_IGNORE; then ieee_handler will disable the trap on
exception. When hdl == SIGFPE_ABORT, any trap on exception
will dump core using abort(3C). clear all disables trapping
on all five exceptions.
Two steps are required to intercept an IEEE-related SIGFPE
code with ieee_handler:
1. Set up a handler with ieee_handler.
Copyright 1994 Novell, Inc. Page 1
ieee_handler(3BSD) (BSD System Compatibility) ieee_handler(3BSD)
2. Perform a floating-point operation that generates the
intended IEEE exception.
Unlike sigfpe(3BSD), ieee_handler also adjusts floating-point
hardware mode bits affecting IEEE trapping. For clear, set
SIGFPE_DEFAULT, or set SIGFPE_IGNORE, the hardware trap is
disabled. For any other set, the hardware trap is enabled.
SIGFPE signals can be handled using sigvec(3BSD),
signal(3BSD), sigfpe(3BSD), or ieee_handler. In a particular
program, to avoid confusion, use only one of these interfaces
to handle SIGFPE signals.
RETURN VALUES
ieee_handler normally returns 0. In the case of set, 1 will
be returned if the action is not available (for instance, not
supported in hardware).
EXAMPLES
A user-specified signal handler might look like this:
void sample_handler(int sig, int code,
struct sigcontext *scp, char *addr);
/* sig == SIGFPE always */
{
/*
Sample user-written sigfpe code handler.
Prints a message and continues.
struct sigcontext is defined in <signal.h>.
*/
printf("ieee exception code %x occurred at pc %X \n",
code,scp->sc_pc);
}
and it might be set up like this:
extern void sample_handler;
main
{
sigfpe_handler_type hdl, old_handler1, old_handler2;
/*
* save current overflow and invalid handlers
*/
ieee_handler("get","overflow",old_handler1);
ieee_handler("get","invalid", old_handler2);
/*
* set new overflow handler to sample_handler and set new
* invalid handler to SIGFPE_ABORT (abort on invalid)
Copyright 1994 Novell, Inc. Page 2
ieee_handler(3BSD) (BSD System Compatibility) ieee_handler(3BSD)
*/
hdl = (sigfpe_handler_type) sample_handler;
if(ieee_handler("set","overflow",hdl) != 0)
printf("ieee_handler can't set overflow \n");
if(ieee_handler("set","invalid",SIGFPE_ABORT) != 0)
printf("ieee_handler can't set invalid \n");
...
/*
* restore old overflow and invalid handlers
*/
ieee_handler("set","overflow", old_handler1);
ieee_handler("set","invalid", old_handler2);
}
FILES
/usr/include/fp.h
/usr/include/signal.h
REFERENCES
abort(3C), floatingpoint(3BSD), sigfpe(3BSD), signal(3BSD),
sigvec(3BSD)
Copyright 1994 Novell, Inc. Page 3