diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 1999-03-01 15:18:26 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 1999-03-01 15:18:26 +0000 |
commit | e069cdc3f1b5350d19244c0dbf187044ad7f08f7 (patch) | |
tree | 7258dcab2a888a5c9d0d48ca4fb46f9b7e58bec6 /c/src/lib/libbsp/sparc/erc32/gnatsupp/gnatsupp.c | |
parent | Corrected the comments on --enable-gcc28 and switched the sense of the (diff) | |
download | rtems-e069cdc3f1b5350d19244c0dbf187044ad7f08f7.tar.bz2 |
Part of the automake VI patch from Ralf Corsepius <corsepiu@faw.uni-ulm.de>:
> 5) rtems-rc-19990202-1.diff/reorg-install.sh
>
> reorg-install.sh fixes a Makefile variable name clash of RTEMS
> configuration files and automake/autoconf standards.
> Until now, RTEMS used $(INSTALL) for install-if-change. Automake and
> autoconf use $(INSTALL) for a bsd-compatible install. As
> install-if-change and bsd-install are not compatible, I renamed all
> references to install-if-changed to $(INSTALL_CHANGED) and used
> $(INSTALL) for bsd-install (==automake/autoconf standard). When
> automake will be introduced install-if-change will probably be replaced
> by $(INSTALL) and therefore will slowly vanish. For the moment, this
> patch fixes a very nasty problem which prevents adding any automake file
> until now (There are still more).
Diffstat (limited to 'c/src/lib/libbsp/sparc/erc32/gnatsupp/gnatsupp.c')
-rw-r--r-- | c/src/lib/libbsp/sparc/erc32/gnatsupp/gnatsupp.c | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/sparc/erc32/gnatsupp/gnatsupp.c b/c/src/lib/libbsp/sparc/erc32/gnatsupp/gnatsupp.c new file mode 100644 index 0000000000..79f1f037db --- /dev/null +++ b/c/src/lib/libbsp/sparc/erc32/gnatsupp/gnatsupp.c @@ -0,0 +1,107 @@ +/* + * + * Support for gnat/rtems machine error exception handling. + * Jiri Gaisler, ESA/ESTEC, 17-02-1999. + * + */ + +#include <bsp.h> +#include <signal.h> + +/* + * Synchronous trap handler. Map the trap number of SIGFPE, SIGSEGV + * or SIGILL to generate the corresponding Ada exception. + */ + +rtems_isr __gnat_exception_handler + ( rtems_vector_number trap) +{ + rtems_unsigned32 real_trap; + rtems_unsigned32 signal; + + real_trap = SPARC_REAL_TRAP_NUMBER(trap); + switch (real_trap) { + case 0x08: /* FPU exception */ + case 0x0A: /* TAG overflow */ + case 0x82: /* divide by zero */ + signal = SIGFPE; /* Will cause Constraint_Error */ + break; + case 0x01: /* Instruction access exception */ + case 0x09: /* Data access exception */ + signal = SIGSEGV; /* Will cause Storage_Error */ + break; + default: /* Anything else ... */ + signal = SIGILL; /* Will cause Program_Error */ + break; + } + kill(getpid(),signal); +} + +/* + * Asynchronous trap handler. As it happens, the interrupt trap numbers for + * SPARC is 17 - 31, so we just map then directly on the same signal. + */ + +rtems_isr __gnat_interrupt_handler + ( rtems_vector_number trap) +{ + rtems_unsigned32 real_trap; + + real_trap = SPARC_REAL_TRAP_NUMBER(trap); + + kill(getpid(),real_trap); + +} + +/* + * Default signal handler with error reporting + */ + +void __gnat_signals_Abormal_termination_handler( int signo ) +{ + switch ( signo ) { + case SIGFPE: + DEBUG_puts("\nConstraint_Error\n"); + break; + case SIGSEGV: + DEBUG_puts("\nStorage_Error\n"); + break; + default: + DEBUG_puts("\nProgram_Error\n"); + break; + } + exit( 1 ); +} + +const struct sigaction __gnat_error_vector = { + 0, -1, {__gnat_signals_Abormal_termination_handler}}; + +void __gnat_install_handler() +{ + rtems_unsigned32 trap; + rtems_isr_entry previous_isr; + + sigaction(SIGSEGV, &__gnat_error_vector, NULL); + sigaction(SIGFPE , &__gnat_error_vector, NULL); + sigaction(SIGILL , &__gnat_error_vector, NULL); + + for ( trap=0 ; trap<256 ; trap++ ) { + + /* + * Skip window overflow, underflow, and flush as well as software + * trap 0 which we will use as a shutdown. Also avoid trap 0x70 - 0x7f + * which cannot happen and where some of the space is used to pass + * paramaters to the program. Trap 0x1d is used by the clock tick + * and 0x83 by the remote debugging stub. + */ + + if (( trap >= 0x11 ) && ( trap <= 0x1f )) { + if ( trap != 0x1d ) + rtems_interrupt_catch( __gnat_interrupt_handler, + trap, &previous_isr ); + } else if (( trap != 5 && trap != 6 && trap != 0x83 ) && + (( trap < 0x70 ) || ( trap > 0x80 ))) + set_vector( __gnat_exception_handler, + SPARC_SYNCHRONOUS_TRAP( trap ), 1 ); + } +} |