summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/powerpc/score603e/startup/spurious.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/powerpc/score603e/startup/spurious.c')
-rw-r--r--c/src/lib/libbsp/powerpc/score603e/startup/spurious.c259
1 files changed, 259 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/powerpc/score603e/startup/spurious.c b/c/src/lib/libbsp/powerpc/score603e/startup/spurious.c
new file mode 100644
index 0000000000..8bc11e41eb
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/score603e/startup/spurious.c
@@ -0,0 +1,259 @@
+/*
+ * Score603e 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 <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
+)
+{
+
+ switch ( trap ) {
+ case PPC_IRQ_SYSTEM_RESET:
+ DEBUG_puts( "\nTrap: System reset" );
+ break;
+ case PPC_IRQ_MCHECK:
+ DEBUG_puts( "\nTrap: Machine check" );
+ break;
+ case PPC_IRQ_PROTECT:
+ DEBUG_puts( "\nTrap: DSI" );
+ break;
+ case PPC_IRQ_ISI:
+ DEBUG_puts( "ISI" );
+ break;
+ case PPC_IRQ_EXTERNAL:
+ DEBUG_puts( "\nTrap: External interupt" );
+ break;
+ case PPC_IRQ_ALIGNMENT:
+ DEBUG_puts( "\nTrap: Alignment Exception" );
+ break;
+ case PPC_IRQ_PROGRAM:
+ DEBUG_puts( "\nTrap: Program" );
+ break;
+ case PPC_IRQ_NOFP:
+ DEBUG_puts( "\nTrap: Floating point unavailable" );
+ break;
+ case PPC_IRQ_DECREMENTER:
+ DEBUG_puts( "\nTrap: Decrementer" );
+ break;
+ case PPC_IRQ_RESERVED_A:
+ DEBUG_puts( "\nTrap: Reserved 0x00a00" );
+ break;
+ case PPC_IRQ_RESERVED_B:
+ DEBUG_puts( "\nTrap: Reserved 0x00b00" );
+ break;
+ case PPC_IRQ_SCALL:
+ DEBUG_puts( "\nTrap: System call" );
+ break;
+ case PPC_IRQ_TRACE:
+ DEBUG_puts( "\nTrap: Trace" );
+ break;
+ case PPC_IRQ_FP_ASST:
+ DEBUG_puts( "\nTrap: Floating point Assist" );
+ break;
+
+#if defined(ppc403)
+#error "Please fill in names. "
+ case PPC_IRQ_CRIT :
+ DEBUG_puts( "\nTrap: Critical Error ");
+ break;
+ case PPC_IRQ_PIT:
+ DEBUG_puts( "\nTrap: 0x01000" );
+ break;
+ case PPC_IRQ_FIT:
+ DEBUG_puts( "\nTrap: 0x01010" );
+ break;
+ case PPC_IRQ_WATCHDOG :
+ DEBUG_puts( "\nTrap: 0x01020" );
+ break;
+ case PPC_IRQ_DEBUG :
+ DEBUG_puts( "\nTrap: 0x02000" );
+ break;
+
+#elif defined(ppc601)
+#error "Please fill in names. "
+ case PPC_IRQ_TRACE :
+ DEBUG_puts( "\nTrap: 0x02000" );
+ break;
+
+#elif defined(ppc603)
+#error "Please fill in names. "
+ case PPC_IRQ_TRANS_MISS :
+ DEBUG_puts( "\nTrap: 0x1000" );
+ break;
+ case PPC_IRQ_DATA_LOAD:
+ DEBUG_puts( "\nTrap: 0x1100" );
+ break;
+ case PPC_IRQ_DATA_STORE:
+ DEBUG_puts( "\nTrap: 0x1200" );
+ break;
+ case PPC_IRQ_ADDR_BRK:
+ DEBUG_puts( "\nTrap: 0x1300" );
+ break;
+ case PPC_IRQ_SYS_MGT:
+ DEBUG_puts( "\nTrap: 0x1400" );
+ break;
+
+#elif defined(ppc603e)
+ case PPC_TLB_INST_MISS:
+ DEBUG_puts( "\nTrap: Instruction Translation Miss" );
+ break;
+ case PPC_TLB_LOAD_MISS:
+ DEBUG_puts( "\nTrap: Data Load Translation Miss" );
+ break;
+ case PPC_TLB_STORE_MISS :
+ DEBUG_puts( "\nTrap: Data store Translation Miss");
+ break;
+ case PPC_IRQ_ADDRBRK:
+ DEBUG_puts( "\nTrap: Instruction address break point" );
+ break;
+ case PPC_IRQ_SYS_MGT:
+ DEBUG_puts( "\nTrap: 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( "\nTrap: Undefined exception " );
+ break;
+ }
+
+ /*
+ * What else can we do but stop ...
+ */
+ /*
+ asm volatile( "" );
+ */
+ while (1);
+}
+
+/*
+ * 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++ ) {
+ if (trap == PPC_IRQ_DECREMENTER)
+ ;
+ /* set_vector( bsp_stub_handler, trap, 1 ); */
+ else
+ set_vector( bsp_spurious_handler, trap, 1 );
+ }
+}
+
+void bsp_set_trap_vectors( void )
+{
+ volatile rtems_unsigned32 *ptr;
+
+ /* reset_vector */
+ ptr = (rtems_unsigned32 *)0x00100 ;
+ *ptr = 0x48000000;
+
+ /* org mach_vector */
+ ptr = (rtems_unsigned32 *)0x00200;
+ *ptr = 0x48000000;
+
+ /* org prot_vector */
+ ptr = (rtems_unsigned32 *)0x00300;
+ *ptr = 0x48000000;
+
+ /* org isi_vector */
+ ptr = (rtems_unsigned32 *)0x00400;
+ *ptr = 0x48000000;
+
+ /* org ext_vector */
+ ptr = (rtems_unsigned32 *)0x0500 ;
+ *ptr = 0x48000000;
+
+ /* org align_vector */
+ ptr = (rtems_unsigned32 *)0x00600 ;
+ *ptr = 0x48000000;
+
+ /* org prog_vector */
+ ptr = (rtems_unsigned32 *)0x00700 ;
+ *ptr = 0x48000000;
+
+ /* org float_vector */
+ ptr = (rtems_unsigned32 *)0x00800;
+ *ptr = 0x48000000;
+
+ /* org dec_vector - rfi */
+ ptr = (rtems_unsigned32 *)0x900;
+ *ptr = 0x4c000064;
+
+ /* org sys_vector */
+ ptr = (rtems_unsigned32 *)0x0c00 ;
+ *ptr = 0x48000000;
+
+ /* org trace_vector */
+ ptr = (rtems_unsigned32 *)0x0d00 ;
+ *ptr = 0x48000000;
+
+ /* org itm_vector */
+ ptr = (rtems_unsigned32 *)0x01000 ;
+ *ptr = 0x48000000;
+
+ /* org dltm_vector */
+ ptr = (rtems_unsigned32 *)0x01100 ;
+ *ptr = 0x48000000;
+
+ /* org dstm_vector */
+ ptr = (rtems_unsigned32 *)0x1200 ;
+ *ptr = 0x48000000;
+
+ /* org addr_vector */
+ ptr = (rtems_unsigned32 *)0x1300 ;
+ *ptr = 0x48000000;
+
+ /* org sysmgmt_vector */
+ ptr = (rtems_unsigned32 *)0x1400 ;
+ *ptr = 0x48000000;
+
+}
+
+
+
+
+