From f42fb02e1d0c406291cd6e78b8484d5a66b2e963 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Fri, 6 Aug 1999 16:00:32 +0000 Subject: Patch from Jiri Gaisler to fix remote gdb use: I just released erc32ccs-2.0.6 which includes some fixes and the Ada-self optimisation. Remote debugging of Ada programs did not work due to a conflict between monior and rtems trap handlers. I have attached a modified gnatsupp.c that makes remote debugging possible again. --- c/src/lib/libbsp/sparc/erc32/gnatsupp/gnatsupp.c | 140 ++++++++++++----------- 1 file changed, 73 insertions(+), 67 deletions(-) (limited to 'c') diff --git a/c/src/lib/libbsp/sparc/erc32/gnatsupp/gnatsupp.c b/c/src/lib/libbsp/sparc/erc32/gnatsupp/gnatsupp.c index e0ef0cb795..1280ed9b16 100644 --- a/c/src/lib/libbsp/sparc/erc32/gnatsupp/gnatsupp.c +++ b/c/src/lib/libbsp/sparc/erc32/gnatsupp/gnatsupp.c @@ -1,6 +1,6 @@ /* * - * Support for gnat/rtems machine error exception handling. + * Support for gnat/rtems interrupts and exception handling. * Jiri Gaisler, ESA/ESTEC, 17-02-1999. * */ @@ -14,42 +14,43 @@ */ rtems_isr __gnat_exception_handler - ( rtems_vector_number trap) + (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; + 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); + 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. + * SPARC is 17 - 31, so we just map then directly on the same signal number. */ rtems_isr __gnat_interrupt_handler - ( rtems_vector_number trap) + (rtems_vector_number trap) { - rtems_unsigned32 real_trap; + rtems_unsigned32 real_trap; - real_trap = SPARC_REAL_TRAP_NUMBER(trap); + real_trap = SPARC_REAL_TRAP_NUMBER (trap); - kill(getpid(),real_trap); + kill (getpid (), real_trap); } @@ -57,52 +58,57 @@ rtems_isr __gnat_interrupt_handler * Default signal handler with error reporting */ -void __gnat_signals_Abormal_termination_handler( int signo ) +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 ); + 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}}; +const struct sigaction __gnat_error_vector = +{0, -1, + {__gnat_signals_Abormal_termination_handler}}; -void __gnat_install_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. Traps 0x14, 0x15, and 0x17 - * are used by the console device driver. - */ - - if (( trap >= 0x11 ) && ( trap <= 0x1f )) { - if ( trap != 0x1d && trap != 0x14 && trap != 0x15 && trap != 0x17 ) - 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 ); + 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, + * 0x80 for system traps and 0x81 - 0x83 by the remote debugging stub. + * Avoid 0x15 (UART B interrupt) which is also used by the stub + * to generate a 'break-in' interrupt. + */ + + if ((trap >= 0x11) && (trap <= 0x1f)) + { + if ((trap != 0x1d) && (trap != 0x15)) + rtems_interrupt_catch (__gnat_interrupt_handler, trap, &previous_isr); + } + else if ((trap != 5 && trap != 6) && ((trap < 0x70) || (trap > 0x83))) + set_vector (__gnat_exception_handler, SPARC_SYNCHRONOUS_TRAP (trap), 1); } } -- cgit v1.2.3