summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1999-08-06 16:00:32 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1999-08-06 16:00:32 +0000
commitf42fb02e1d0c406291cd6e78b8484d5a66b2e963 (patch)
treea5f37f9b85af1585e23b76b6380932c656f5f291
parentNow supports C++ global constructors and exceptions. (diff)
downloadrtems-f42fb02e1d0c406291cd6e78b8484d5a66b2e963.tar.bz2
Patch from Jiri Gaisler <jgais@ws.estec.esa.nl> 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.
-rw-r--r--c/src/lib/libbsp/sparc/erc32/gnatsupp/gnatsupp.c140
1 files changed, 73 insertions, 67 deletions
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);
}
}