/*
|
/*
|
* Score603e Spurious Trap Handler
|
* Score603e Spurious Trap Handler
|
*
|
*
|
* This is just enough of a trap handler to let us know what
|
* This is just enough of a trap handler to let us know what
|
* the likely source of the trap was.
|
* the likely source of the trap was.
|
*
|
*
|
* Developed as part of the port of RTEMS to the ERC32 implementation
|
* Developed as part of the port of RTEMS to the ERC32 implementation
|
* of the SPARC by On-Line Applications Research Corporation (OAR)
|
* of the SPARC by On-Line Applications Research Corporation (OAR)
|
* under contract to the European Space Agency (ESA).
|
* under contract to the European Space Agency (ESA).
|
*
|
*
|
* COPYRIGHT (c) 1995. European Space Agency.
|
* COPYRIGHT (c) 1995. European Space Agency.
|
*
|
*
|
* This terms of the RTEMS license apply to this file.
|
* This terms of the RTEMS license apply to this file.
|
*
|
*
|
* $Id: spurious.c,v 1.2 2001-09-27 12:01:04 chris Exp $
|
* $Id: spurious.c,v 1.2 2001-09-27 12:01:04 chris Exp $
|
*/
|
*/
|
|
|
#include <bsp.h>
|
#include <bsp.h>
|
|
|
#include <string.h>
|
#include <string.h>
|
|
|
static const char digits[16] = "0123456789abcdef";
|
static const char digits[16] = "0123456789abcdef";
|
|
|
rtems_isr bsp_stub_handler(
|
rtems_isr bsp_stub_handler(
|
rtems_vector_number trap
|
rtems_vector_number trap
|
)
|
)
|
{
|
{
|
}
|
}
|
|
|
/*
|
/*
|
* bsp_spurious_handler
|
* bsp_spurious_handler
|
*
|
*
|
* Print a message on the debug console and then die
|
* Print a message on the debug console and then die
|
*/
|
*/
|
rtems_isr bsp_spurious_handler(
|
rtems_isr bsp_spurious_handler(
|
rtems_vector_number trap
|
rtems_vector_number trap
|
)
|
)
|
{
|
{
|
|
|
switch ( trap ) {
|
switch ( trap ) {
|
case PPC_IRQ_SYSTEM_RESET:
|
case PPC_IRQ_SYSTEM_RESET:
|
DEBUG_puts( "\nTrap: System reset" );
|
DEBUG_puts( "\nTrap: System reset" );
|
break;
|
break;
|
case PPC_IRQ_MCHECK:
|
case PPC_IRQ_MCHECK:
|
DEBUG_puts( "\nTrap: Machine check" );
|
DEBUG_puts( "\nTrap: Machine check" );
|
break;
|
break;
|
case PPC_IRQ_PROTECT:
|
case PPC_IRQ_PROTECT:
|
DEBUG_puts( "\nTrap: DSI" );
|
DEBUG_puts( "\nTrap: DSI" );
|
break;
|
break;
|
case PPC_IRQ_ISI:
|
case PPC_IRQ_ISI:
|
DEBUG_puts( "ISI" );
|
DEBUG_puts( "ISI" );
|
break;
|
break;
|
case PPC_IRQ_EXTERNAL:
|
case PPC_IRQ_EXTERNAL:
|
DEBUG_puts( "\nTrap: External interupt" );
|
DEBUG_puts( "\nTrap: External interupt" );
|
break;
|
break;
|
case PPC_IRQ_ALIGNMENT:
|
case PPC_IRQ_ALIGNMENT:
|
DEBUG_puts( "\nTrap: Alignment Exception" );
|
DEBUG_puts( "\nTrap: Alignment Exception" );
|
break;
|
break;
|
case PPC_IRQ_PROGRAM:
|
case PPC_IRQ_PROGRAM:
|
DEBUG_puts( "\nTrap: Program" );
|
DEBUG_puts( "\nTrap: Program" );
|
break;
|
break;
|
case PPC_IRQ_NOFP:
|
case PPC_IRQ_NOFP:
|
DEBUG_puts( "\nTrap: Floating point unavailable" );
|
DEBUG_puts( "\nTrap: Floating point unavailable" );
|
break;
|
break;
|
case PPC_IRQ_DECREMENTER:
|
case PPC_IRQ_DECREMENTER:
|
DEBUG_puts( "\nTrap: Decrementer" );
|
DEBUG_puts( "\nTrap: Decrementer" );
|
break;
|
break;
|
case PPC_IRQ_RESERVED_A:
|
case PPC_IRQ_RESERVED_A:
|
DEBUG_puts( "\nTrap: Reserved 0x00a00" );
|
DEBUG_puts( "\nTrap: Reserved 0x00a00" );
|
break;
|
break;
|
case PPC_IRQ_RESERVED_B:
|
case PPC_IRQ_RESERVED_B:
|
DEBUG_puts( "\nTrap: Reserved 0x00b00" );
|
DEBUG_puts( "\nTrap: Reserved 0x00b00" );
|
break;
|
break;
|
case PPC_IRQ_SCALL:
|
case PPC_IRQ_SCALL:
|
DEBUG_puts( "\nTrap: System call" );
|
DEBUG_puts( "\nTrap: System call" );
|
break;
|
break;
|
case PPC_IRQ_TRACE:
|
case PPC_IRQ_TRACE:
|
DEBUG_puts( "\nTrap: Trace" );
|
DEBUG_puts( "\nTrap: Trace" );
|
break;
|
break;
|
case PPC_IRQ_FP_ASST:
|
case PPC_IRQ_FP_ASST:
|
DEBUG_puts( "\nTrap: Floating point Assist" );
|
DEBUG_puts( "\nTrap: Floating point Assist" );
|
break;
|
break;
|
|
|
#if defined(ppc403)
|
#if defined(ppc403)
|
#error "Please fill in names. "
|
#error "Please fill in names. "
|
case PPC_IRQ_CRIT :
|
case PPC_IRQ_CRIT :
|
DEBUG_puts( "\nTrap: Critical Error ");
|
DEBUG_puts( "\nTrap: Critical Error ");
|
break;
|
break;
|
case PPC_IRQ_PIT:
|
case PPC_IRQ_PIT:
|
DEBUG_puts( "\nTrap: 0x01000" );
|
DEBUG_puts( "\nTrap: 0x01000" );
|
break;
|
break;
|
case PPC_IRQ_FIT:
|
case PPC_IRQ_FIT:
|
DEBUG_puts( "\nTrap: 0x01010" );
|
DEBUG_puts( "\nTrap: 0x01010" );
|
break;
|
break;
|
case PPC_IRQ_WATCHDOG :
|
case PPC_IRQ_WATCHDOG :
|
DEBUG_puts( "\nTrap: 0x01020" );
|
DEBUG_puts( "\nTrap: 0x01020" );
|
break;
|
break;
|
case PPC_IRQ_DEBUG :
|
case PPC_IRQ_DEBUG :
|
DEBUG_puts( "\nTrap: 0x02000" );
|
DEBUG_puts( "\nTrap: 0x02000" );
|
break;
|
break;
|
|
|
#elif defined(ppc601)
|
#elif defined(ppc601)
|
#error "Please fill in names. "
|
#error "Please fill in names. "
|
case PPC_IRQ_TRACE :
|
case PPC_IRQ_TRACE :
|
DEBUG_puts( "\nTrap: 0x02000" );
|
DEBUG_puts( "\nTrap: 0x02000" );
|
break;
|
break;
|
|
|
#elif defined(ppc603)
|
#elif defined(ppc603)
|
#error "Please fill in names. "
|
#error "Please fill in names. "
|
case PPC_IRQ_TRANS_MISS :
|
case PPC_IRQ_TRANS_MISS :
|
DEBUG_puts( "\nTrap: 0x1000" );
|
DEBUG_puts( "\nTrap: 0x1000" );
|
break;
|
break;
|
case PPC_IRQ_DATA_LOAD:
|
case PPC_IRQ_DATA_LOAD:
|
DEBUG_puts( "\nTrap: 0x1100" );
|
DEBUG_puts( "\nTrap: 0x1100" );
|
break;
|
break;
|
case PPC_IRQ_DATA_STORE:
|
case PPC_IRQ_DATA_STORE:
|
DEBUG_puts( "\nTrap: 0x1200" );
|
DEBUG_puts( "\nTrap: 0x1200" );
|
break;
|
break;
|
case PPC_IRQ_ADDR_BRK:
|
case PPC_IRQ_ADDR_BRK:
|
DEBUG_puts( "\nTrap: 0x1300" );
|
DEBUG_puts( "\nTrap: 0x1300" );
|
break;
|
break;
|
case PPC_IRQ_SYS_MGT:
|
case PPC_IRQ_SYS_MGT:
|
DEBUG_puts( "\nTrap: 0x1400" );
|
DEBUG_puts( "\nTrap: 0x1400" );
|
break;
|
break;
|
|
|
#elif defined(ppc603e)
|
#elif defined(ppc603e)
|
case PPC_TLB_INST_MISS:
|
case PPC_TLB_INST_MISS:
|
DEBUG_puts( "\nTrap: Instruction Translation Miss" );
|
DEBUG_puts( "\nTrap: Instruction Translation Miss" );
|
break;
|
break;
|
case PPC_TLB_LOAD_MISS:
|
case PPC_TLB_LOAD_MISS:
|
DEBUG_puts( "\nTrap: Data Load Translation Miss" );
|
DEBUG_puts( "\nTrap: Data Load Translation Miss" );
|
break;
|
break;
|
case PPC_TLB_STORE_MISS :
|
case PPC_TLB_STORE_MISS :
|
DEBUG_puts( "\nTrap: Data store Translation Miss");
|
DEBUG_puts( "\nTrap: Data store Translation Miss");
|
break;
|
break;
|
case PPC_IRQ_ADDRBRK:
|
case PPC_IRQ_ADDRBRK:
|
DEBUG_puts( "\nTrap: Instruction address break point" );
|
DEBUG_puts( "\nTrap: Instruction address break point" );
|
break;
|
break;
|
case PPC_IRQ_SYS_MGT:
|
case PPC_IRQ_SYS_MGT:
|
DEBUG_puts( "\nTrap: System management interrupt" );
|
DEBUG_puts( "\nTrap: System management interrupt" );
|
break;
|
break;
|
|
|
#elif defined(ppc604)
|
#elif defined(ppc604)
|
#error "Please fill in names. "
|
#error "Please fill in names. "
|
case PPC_IRQ_ADDR_BRK:
|
case PPC_IRQ_ADDR_BRK:
|
DEBUG_puts( "0x1300" );
|
DEBUG_puts( "0x1300" );
|
break;
|
break;
|
case PPC_IRQ_SYS_MGT:
|
case PPC_IRQ_SYS_MGT:
|
DEBUG_puts( "0x1400" );
|
DEBUG_puts( "0x1400" );
|
break;
|
break;
|
#endif
|
#endif
|
|
|
default:
|
default:
|
DEBUG_puts( "\nTrap: Undefined exception " );
|
DEBUG_puts( "\nTrap: Undefined exception " );
|
break;
|
break;
|
}
|
}
|
|
|
/*
|
/*
|
* What else can we do but stop ...
|
* What else can we do but stop ...
|
*/
|
*/
|
/*
|
/*
|
asm volatile( "" );
|
asm volatile( "" );
|
*/
|
*/
|
while (1);
|
while (1);
|
}
|
}
|
|
|
/*
|
/*
|
* bsp_spurious_initialize
|
* bsp_spurious_initialize
|
*
|
*
|
* Install the spurious handler for most traps.
|
* Install the spurious handler for most traps.
|
*/
|
*/
|
|
|
void bsp_spurious_initialize()
|
void bsp_spurious_initialize()
|
{
|
{
|
rtems_unsigned32 trap;
|
rtems_unsigned32 trap;
|
|
|
for ( trap=0 ; trap < PPC_IRQ_LAST ; trap++ ) {
|
for ( trap=0 ; trap < PPC_IRQ_LAST ; trap++ ) {
|
if (trap == PPC_IRQ_DECREMENTER)
|
if (trap == PPC_IRQ_DECREMENTER)
|
;
|
;
|
/* set_vector( bsp_stub_handler, trap, 1 ); */
|
/* set_vector( bsp_stub_handler, trap, 1 ); */
|
else
|
else
|
set_vector( bsp_spurious_handler, trap, 1 );
|
set_vector( bsp_spurious_handler, trap, 1 );
|
}
|
}
|
}
|
}
|
|
|
void bsp_set_trap_vectors( void )
|
void bsp_set_trap_vectors( void )
|
{
|
{
|
volatile rtems_unsigned32 *ptr;
|
volatile rtems_unsigned32 *ptr;
|
|
|
/* reset_vector */
|
/* reset_vector */
|
ptr = (rtems_unsigned32 *)0x00100 ;
|
ptr = (rtems_unsigned32 *)0x00100 ;
|
*ptr = 0x48000000;
|
*ptr = 0x48000000;
|
|
|
/* org mach_vector */
|
/* org mach_vector */
|
ptr = (rtems_unsigned32 *)0x00200;
|
ptr = (rtems_unsigned32 *)0x00200;
|
*ptr = 0x48000000;
|
*ptr = 0x48000000;
|
|
|
/* org prot_vector */
|
/* org prot_vector */
|
ptr = (rtems_unsigned32 *)0x00300;
|
ptr = (rtems_unsigned32 *)0x00300;
|
*ptr = 0x48000000;
|
*ptr = 0x48000000;
|
|
|
/* org isi_vector */
|
/* org isi_vector */
|
ptr = (rtems_unsigned32 *)0x00400;
|
ptr = (rtems_unsigned32 *)0x00400;
|
*ptr = 0x48000000;
|
*ptr = 0x48000000;
|
|
|
/* org ext_vector */
|
/* org ext_vector */
|
ptr = (rtems_unsigned32 *)0x0500 ;
|
ptr = (rtems_unsigned32 *)0x0500 ;
|
*ptr = 0x48000000;
|
*ptr = 0x48000000;
|
|
|
/* org align_vector */
|
/* org align_vector */
|
ptr = (rtems_unsigned32 *)0x00600 ;
|
ptr = (rtems_unsigned32 *)0x00600 ;
|
*ptr = 0x48000000;
|
*ptr = 0x48000000;
|
|
|
/* org prog_vector */
|
/* org prog_vector */
|
ptr = (rtems_unsigned32 *)0x00700 ;
|
ptr = (rtems_unsigned32 *)0x00700 ;
|
*ptr = 0x48000000;
|
*ptr = 0x48000000;
|
|
|
/* org float_vector */
|
/* org float_vector */
|
ptr = (rtems_unsigned32 *)0x00800;
|
ptr = (rtems_unsigned32 *)0x00800;
|
*ptr = 0x48000000;
|
*ptr = 0x48000000;
|
|
|
/* org dec_vector - rfi */
|
/* org dec_vector - rfi */
|
ptr = (rtems_unsigned32 *)0x900;
|
ptr = (rtems_unsigned32 *)0x900;
|
*ptr = 0x4c000064;
|
*ptr = 0x4c000064;
|
|
|
/* org sys_vector */
|
/* org sys_vector */
|
ptr = (rtems_unsigned32 *)0x0c00 ;
|
ptr = (rtems_unsigned32 *)0x0c00 ;
|
*ptr = 0x48000000;
|
*ptr = 0x48000000;
|
|
|
/* org trace_vector */
|
/* org trace_vector */
|
ptr = (rtems_unsigned32 *)0x0d00 ;
|
ptr = (rtems_unsigned32 *)0x0d00 ;
|
*ptr = 0x48000000;
|
*ptr = 0x48000000;
|
|
|
/* org itm_vector */
|
/* org itm_vector */
|
ptr = (rtems_unsigned32 *)0x01000 ;
|
ptr = (rtems_unsigned32 *)0x01000 ;
|
*ptr = 0x48000000;
|
*ptr = 0x48000000;
|
|
|
/* org dltm_vector */
|
/* org dltm_vector */
|
ptr = (rtems_unsigned32 *)0x01100 ;
|
ptr = (rtems_unsigned32 *)0x01100 ;
|
*ptr = 0x48000000;
|
*ptr = 0x48000000;
|
|
|
/* org dstm_vector */
|
/* org dstm_vector */
|
ptr = (rtems_unsigned32 *)0x1200 ;
|
ptr = (rtems_unsigned32 *)0x1200 ;
|
*ptr = 0x48000000;
|
*ptr = 0x48000000;
|
|
|
/* org addr_vector */
|
/* org addr_vector */
|
ptr = (rtems_unsigned32 *)0x1300 ;
|
ptr = (rtems_unsigned32 *)0x1300 ;
|
*ptr = 0x48000000;
|
*ptr = 0x48000000;
|
|
|
/* org sysmgmt_vector */
|
/* org sysmgmt_vector */
|
ptr = (rtems_unsigned32 *)0x1400 ;
|
ptr = (rtems_unsigned32 *)0x1400 ;
|
*ptr = 0x48000000;
|
*ptr = 0x48000000;
|
|
|
}
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|