diff options
Diffstat (limited to 'c/src/lib/libbsp/powerpc/ppcn_60x/startup/spurious.c')
-rw-r--r-- | c/src/lib/libbsp/powerpc/ppcn_60x/startup/spurious.c | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/powerpc/ppcn_60x/startup/spurious.c b/c/src/lib/libbsp/powerpc/ppcn_60x/startup/spurious.c new file mode 100644 index 0000000000..af18752c71 --- /dev/null +++ b/c/src/lib/libbsp/powerpc/ppcn_60x/startup/spurious.c @@ -0,0 +1,202 @@ +/* + * PPCn_60x Spurious Trap Handler + * + * This is just enough of a trap handler to let us know what + * the likely source of the trap was. + * + * Based upon the SPARC ERC32 version which 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 <bsp.h> + +#include <string.h> + +static const char digits[16] = "0123456789abcdef"; + +rtems_isr bsp_stub_handler( + rtems_vector_number trap +) +{ +} + +/* + * bsp_spurious_handler + * + * Print a message on the debug console and then die + */ +rtems_isr bsp_spurious_handler( + rtems_vector_number trap +) +{ + + + + DEBUG_puts( "Spurious Trap" ); + + switch ( trap ) { + case PPC_IRQ_SYSTEM_RESET: + DEBUG_puts( "System reset" ); + break; + case PPC_IRQ_MCHECK: + DEBUG_puts( "Machine check" ); + break; + case PPC_IRQ_PROTECT: + DEBUG_puts( "DSI" ); + break; + case PPC_IRQ_ISI: + DEBUG_puts( "ISI" ); + break; + case PPC_IRQ_EXTERNAL: + DEBUG_puts( "External interupt" ); + break; + case PPC_IRQ_ALIGNMENT: + DEBUG_puts( "Alignment Exception" ); + break; + case PPC_IRQ_PROGRAM: + DEBUG_puts( "Program" ); + break; + case PPC_IRQ_NOFP: + DEBUG_puts( "Floating point unavailable" ); + break; + case PPC_IRQ_DECREMENTER: + DEBUG_puts( "Decrementer" ); + break; + case PPC_IRQ_RESERVED_A: + DEBUG_puts( "Reserved 0x00a00" ); + break; + case PPC_IRQ_RESERVED_B: + DEBUG_puts( "Reserved 0x00b00" ); + break; + case PPC_IRQ_SCALL: + DEBUG_puts( "System call" ); + break; + case PPC_IRQ_TRACE: + DEBUG_puts( "Trace" ); + break; + case PPC_IRQ_FP_ASST: + DEBUG_puts( "Floating point Assist" ); + break; + +#if defined(ppc403) +#error "Please fill in names. " + case PPC_IRQ_CRIT : + DEBUG_puts( "Critical Error "); + break; + case PPC_IRQ_PIT: + DEBUG_puts( "0x01000" ); + break; + case PPC_IRQ_FIT: + DEBUG_puts( "0x01010" ); + break; + case PPC_IRQ_WATCHDOG : + DEBUG_puts( "0x01020" ); + break; + case PPC_IRQ_DEBUG : + DEBUG_puts( "0x02000" ); + break; + +#elif defined(ppc601) +#error "Please fill in names. " + case PPC_IRQ_TRACE : + DEBUG_puts( "0x02000" ); + break; + +#elif defined(ppc603) +#error "Please fill in names. " + case PPC_IRQ_TRANS_MISS : + DEBUG_puts( "0x1000" ); + break; + case PPC_IRQ_DATA_LOAD: + DEBUG_puts( "0x1100" ); + break; + case PPC_IRQ_DATA_STORE: + DEBUG_puts( "0x1200" ); + break; + case PPC_IRQ_ADDR_BRK: + DEBUG_puts( "0x1300" ); + break; + case PPC_IRQ_SYS_MGT: + DEBUG_puts( "0x1400" ); + break; + +#elif defined(ppc603e) + case PPC_TLB_INST_MISS: + DEBUG_puts( "Instruction Translation Miss" ); + break; + case PPC_TLB_LOAD_MISS: + DEBUG_puts( "Data Load Translation Miss" ); + break; + case PPC_TLB_STORE_MISS : + DEBUG_puts( "Data store Translation Miss"); + break; + case PPC_IRQ_ADDRBRK: + DEBUG_puts( "Instruction address break point" ); + break; + case PPC_IRQ_SYS_MGT: + DEBUG_puts( "System management interrupt" ); + break; + +#elif defined(ppc604) +#error "Please fill in names. " + case PPC_IRQ_ADDR_BRK: + DEBUG_puts( "0x1300" ); + break; + case PPC_IRQ_SYS_MGT: + DEBUG_puts( "0x1400" ); + break; +#endif + + default: + DEBUG_puts( "Undefined exception " ); + break; + } + + /* + * What else can we do but stop ... + */ + /* + asm volatile( "" ); + */ +} + +/* + * bsp_spurious_initialize + * + * Install the spurious handler for most traps. + */ + +void bsp_spurious_initialize() +{ + rtems_unsigned32 trap; + + for ( trap=0 ; trap < PPC_IRQ_LAST ; trap++ ) { + + /* + * Skip window overflow, underflow, and flush as well as software + * trap 0 which we will use as a shutdown. + */ + + set_vector( bsp_spurious_handler, trap, 1 ); + } + + set_vector( bsp_stub_handler, PPC_IRQ_DECREMENTER, 1 ); + set_vector( bsp_stub_handler, PPC_IRQ_TRACE, 1 ); + set_vector( bsp_stub_handler, PPC_IRQ_SYS_MGT, 1 ); +} + + + + + + + + |