From cb585c31590c9bfa6675bfc7c5e04842edce0d4a Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Wed, 29 Jan 1997 00:32:23 +0000 Subject: erc32 bsp supercedes sis --- c/src/lib/libbsp/sparc/erc32/startup/spurious.c | 164 ++++++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 c/src/lib/libbsp/sparc/erc32/startup/spurious.c (limited to 'c/src/lib/libbsp/sparc/erc32/startup/spurious.c') diff --git a/c/src/lib/libbsp/sparc/erc32/startup/spurious.c b/c/src/lib/libbsp/sparc/erc32/startup/spurious.c new file mode 100644 index 0000000000..fa1a704079 --- /dev/null +++ b/c/src/lib/libbsp/sparc/erc32/startup/spurious.c @@ -0,0 +1,164 @@ +/* + * ERC32 Spurious Trap Handler + * + * This is just enough of a trap handler to let us know what + * the likely source of the trap was. + * + * Developed as part of the port of RTEMS to the ERC32 implementation + * of the SPARC by On-Line Applications Research Corporation (OAR) + * under contract to the European Space Agency (ESA). + * + * COPYRIGHT (c) 1995. European Space Agency. + * + * This terms of the RTEMS license apply to this file. + * + * $Id$ + */ + +#include + +#include + +static const char digits[16] = "0123456789abcdef"; + +/* + * bsp_spurious_handler + * + * Print a message on the debug console and then die + */ + +rtems_isr bsp_spurious_handler( + rtems_vector_number trap +) +{ + char line[ 80 ]; + int length; + rtems_unsigned32 real_trap; + + DEBUG_puts( "Spurious Trap" ); + + real_trap = SPARC_REAL_TRAP_NUMBER(trap); + + switch (real_trap) { + + /* + * First the ones defined by the basic architecture + */ + + case 0x00: + DEBUG_puts( "reset" ); + break; + case 0x01: + DEBUG_puts( "instruction access exception" ); + break; + case 0x02: + DEBUG_puts( "illegal instruction" ); + break; + case 0x03: + DEBUG_puts( "privileged instruction" ); + break; + case 0x04: + DEBUG_puts( "fp disabled" ); + break; + case 0x07: + DEBUG_puts( "memory address not aligned" ); + break; + case 0x08: + DEBUG_puts( "fp exception" ); + break; + case 0x09: + DEBUG_puts( "data access exception" ); + break; + case 0x0A: + DEBUG_puts( "tag overflow" ); + break; + + /* + * Then the ones defined by the ERC32 in particular + */ + + case ERC32_TRAP_TYPE( ERC32_INTERRUPT_MASKED_ERRORS ): + DEBUG_puts( "ERC32_INTERRUPT_MASKED_ERRORS" ); + break; + case ERC32_TRAP_TYPE( ERC32_INTERRUPT_EXTERNAL_1 ): + DEBUG_puts( "ERC32_INTERRUPT_EXTERNAL_1" ); + break; + case ERC32_TRAP_TYPE( ERC32_INTERRUPT_EXTERNAL_2 ): + DEBUG_puts( "ERC32_INTERRUPT_EXTERNAL_2" ); + break; + case ERC32_TRAP_TYPE( ERC32_INTERRUPT_UART_A_RX_TX ): + DEBUG_puts( "ERC32_INTERRUPT_UART_A_RX_TX" ); + break; + case ERC32_TRAP_TYPE( ERC32_INTERRUPT_UART_B_RX_TX ): + DEBUG_puts( "ERC32_INTERRUPT_UART_A_RX_TX" ); + break; + case ERC32_TRAP_TYPE( ERC32_INTERRUPT_CORRECTABLE_MEMORY_ERROR ): + DEBUG_puts( "ERC32_INTERRUPT_CORRECTABLE_MEMORY_ERROR" ); + break; + case ERC32_TRAP_TYPE( ERC32_INTERRUPT_UART_ERROR ): + DEBUG_puts( "ERC32_INTERRUPT_UART_ERROR" ); + break; + case ERC32_TRAP_TYPE( ERC32_INTERRUPT_DMA_ACCESS_ERROR ): + DEBUG_puts( "ERC32_INTERRUPT_DMA_ACCESS_ERROR" ); + break; + case ERC32_TRAP_TYPE( ERC32_INTERRUPT_DMA_TIMEOUT ): + DEBUG_puts( "ERC32_INTERRUPT_DMA_TIMEOUT" ); + break; + case ERC32_TRAP_TYPE( ERC32_INTERRUPT_EXTERNAL_3 ): + DEBUG_puts( "ERC32_INTERRUPT_EXTERNAL_3" ); + break; + case ERC32_TRAP_TYPE( ERC32_INTERRUPT_EXTERNAL_4 ): + DEBUG_puts( "ERC32_INTERRUPT_EXTERNAL_4" ); + break; + case ERC32_TRAP_TYPE( ERC32_INTERRUPT_GENERAL_PURPOSE_TIMER ): + DEBUG_puts( "ERC32_INTERRUPT_GENERAL_PURPOSE_TIMER" ); + break; + case ERC32_TRAP_TYPE( ERC32_INTERRUPT_REAL_TIME_CLOCK ): + DEBUG_puts( "ERC32_INTERRUPT_REAL_TIME_CLOCK" ); + break; + case ERC32_TRAP_TYPE( ERC32_INTERRUPT_EXTERNAL_5 ): + DEBUG_puts( "ERC32_INTERRUPT_EXTERNAL_5" ); + break; + case ERC32_TRAP_TYPE( ERC32_INTERRUPT_WATCHDOG_TIMEOUT ): + DEBUG_puts( "ERC32_INTERRUPT_WATCHDOG_TIMEOUT" ); + break; + + default: + strcpy( line, "Number 0x " ); + length = strlen ( line ); + line[ length - 2 ] = digits[ real_trap >> 4 ]; + line[ length - 1 ] = digits[ real_trap & 0xf ]; + DEBUG_puts( line ); + break; + } + + /* + * What else can we do but stop ... + */ + + asm volatile( "ta 0x0" ); +} + +/* + * bsp_spurious_initialize + * + * Install the spurious handler for most traps. + */ + +void bsp_spurious_initialize() +{ + rtems_unsigned32 trap; + + 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. + */ + + if ( trap == 5 || trap == 6 || trap == 0x83 || trap == 0x80) + continue; + + set_vector( bsp_spurious_handler, SPARC_SYNCHRONOUS_TRAP( trap ), 1 ); + } +} -- cgit v1.2.3