summaryrefslogblamecommitdiffstats
path: root/c/src/lib/libbsp/powerpc/ppcn_60x/startup/spurious.c
blob: af18752c717ee21206b853967c8606b0dc27cf95 (plain) (tree)









































































































































































































                                                                      
/*
 *  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 );
}