forked from Imagelibrary/rtems
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.
This commit is contained in:
@@ -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.
|
* Jiri Gaisler, ESA/ESTEC, 17-02-1999.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@@ -14,13 +14,14 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
rtems_isr __gnat_exception_handler
|
rtems_isr __gnat_exception_handler
|
||||||
( rtems_vector_number trap)
|
(rtems_vector_number trap)
|
||||||
{
|
{
|
||||||
rtems_unsigned32 real_trap;
|
rtems_unsigned32 real_trap;
|
||||||
rtems_unsigned32 signal;
|
rtems_unsigned32 signal;
|
||||||
|
|
||||||
real_trap = SPARC_REAL_TRAP_NUMBER(trap);
|
real_trap = SPARC_REAL_TRAP_NUMBER (trap);
|
||||||
switch (real_trap) {
|
switch (real_trap)
|
||||||
|
{
|
||||||
case 0x08: /* FPU exception */
|
case 0x08: /* FPU exception */
|
||||||
case 0x0A: /* TAG overflow */
|
case 0x0A: /* TAG overflow */
|
||||||
case 0x82: /* divide by zero */
|
case 0x82: /* divide by zero */
|
||||||
@@ -34,22 +35,22 @@ rtems_isr __gnat_exception_handler
|
|||||||
signal = SIGILL; /* Will cause Program_Error */
|
signal = SIGILL; /* Will cause Program_Error */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
kill(getpid(),signal);
|
kill (getpid (), signal);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Asynchronous trap handler. As it happens, the interrupt trap numbers for
|
* 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_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
|
* Default signal handler with error reporting
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void __gnat_signals_Abormal_termination_handler( int signo )
|
void
|
||||||
|
__gnat_signals_Abormal_termination_handler (int signo)
|
||||||
{
|
{
|
||||||
switch ( signo ) {
|
switch (signo)
|
||||||
|
{
|
||||||
case SIGFPE:
|
case SIGFPE:
|
||||||
DEBUG_puts("\nConstraint_Error\n");
|
DEBUG_puts ("\nConstraint_Error\n");
|
||||||
break;
|
break;
|
||||||
case SIGSEGV:
|
case SIGSEGV:
|
||||||
DEBUG_puts("\nStorage_Error\n");
|
DEBUG_puts ("\nStorage_Error\n");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
DEBUG_puts("\nProgram_Error\n");
|
DEBUG_puts ("\nProgram_Error\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
exit( 1 );
|
exit (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct sigaction __gnat_error_vector = {
|
const struct sigaction __gnat_error_vector =
|
||||||
0, -1, {__gnat_signals_Abormal_termination_handler}};
|
{0, -1,
|
||||||
|
{__gnat_signals_Abormal_termination_handler}};
|
||||||
|
|
||||||
void __gnat_install_handler()
|
void
|
||||||
|
__gnat_install_handler ()
|
||||||
{
|
{
|
||||||
rtems_unsigned32 trap;
|
rtems_unsigned32 trap;
|
||||||
rtems_isr_entry previous_isr;
|
rtems_isr_entry previous_isr;
|
||||||
|
|
||||||
sigaction(SIGSEGV, &__gnat_error_vector, NULL);
|
sigaction (SIGSEGV, &__gnat_error_vector, NULL);
|
||||||
sigaction(SIGFPE , &__gnat_error_vector, NULL);
|
sigaction (SIGFPE, &__gnat_error_vector, NULL);
|
||||||
sigaction(SIGILL , &__gnat_error_vector, NULL);
|
sigaction (SIGILL, &__gnat_error_vector, NULL);
|
||||||
|
|
||||||
for ( trap=0 ; trap<256 ; trap++ ) {
|
for (trap = 0; trap < 256; trap++)
|
||||||
|
{
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Skip window overflow, underflow, and flush as well as software
|
* Skip window overflow, underflow, and flush as well as software
|
||||||
* trap 0 which we will use as a shutdown. Also avoid trap 0x70 - 0x7f
|
* 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
|
* 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
|
* paramaters to the program. Trap 0x1d is used by the clock tick,
|
||||||
* and 0x83 by the remote debugging stub. Traps 0x14, 0x15, and 0x17
|
* 0x80 for system traps and 0x81 - 0x83 by the remote debugging stub.
|
||||||
* are used by the console device driver.
|
* 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 >= 0x11) && (trap <= 0x1f))
|
||||||
if ( trap != 0x1d && trap != 0x14 && trap != 0x15 && trap != 0x17 )
|
{
|
||||||
rtems_interrupt_catch( __gnat_interrupt_handler,
|
if ((trap != 0x1d) && (trap != 0x15))
|
||||||
trap, &previous_isr );
|
rtems_interrupt_catch (__gnat_interrupt_handler, trap, &previous_isr);
|
||||||
} else if (( trap != 5 && trap != 6 && trap != 0x83 ) &&
|
}
|
||||||
(( trap < 0x70 ) || ( trap > 0x80 )))
|
else if ((trap != 5 && trap != 6) && ((trap < 0x70) || (trap > 0x83)))
|
||||||
set_vector( __gnat_exception_handler,
|
set_vector (__gnat_exception_handler, SPARC_SYNCHRONOUS_TRAP (trap), 1);
|
||||||
SPARC_SYNCHRONOUS_TRAP( trap ), 1 );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user