uint32_t _CPU_SMP_Initialize( void ) { if ( !leon3_data_cache_snooping_enabled() ) bsp_fatal( LEON3_FATAL_INVALID_CACHE_CONFIG_MAIN_PROCESSOR ); if ( rtems_configuration_get_maximum_processors() > 1 ) { LEON_Unmask_interrupt(LEON3_mp_irq); set_vector(bsp_inter_processor_interrupt, LEON_TRAP_TYPE(LEON3_mp_irq), 1); } return leon3_get_cpu_count(LEON3_IrqCtrl_Regs); }
uint32_t _CPU_SMP_Initialize( uint32_t configured_cpu_count ) { uint32_t max_cpu_count; uint32_t used_cpu_count; uint32_t cpu; leon3_set_cache_control_register(0x80000F); max_cpu_count = leon3_get_cpu_count(LEON3_IrqCtrl_Regs); used_cpu_count = configured_cpu_count < max_cpu_count ? configured_cpu_count : max_cpu_count; #if defined(RTEMS_DEBUG) printk( "Found %d CPUs\n", max_cpu_count ); if ( max_cpu_count > configured_cpu_count ) { printk( "%d CPUs IS MORE THAN CONFIGURED -- ONLY USING %d\n", max_cpu_count, configured_cpu_count ); } #endif if ( used_cpu_count > 1 ) { LEON_Unmask_interrupt(LEON3_MP_IRQ); set_vector(bsp_inter_processor_interrupt, LEON_TRAP_TYPE(LEON3_MP_IRQ), 1); } for ( cpu = 1 ; cpu < used_cpu_count ; ++cpu ) { #if defined(RTEMS_DEBUG) printk( "Waking CPU %d\n", cpu ); #endif LEON3_IrqCtrl_Regs->mpstat = 1 << cpu; } return used_cpu_count; }
rtems_isr bsp_spurious_handler( rtems_vector_number trap, CPU_Interrupt_frame *isf ) { uint32_t real_trap; real_trap = SPARC_REAL_TRAP_NUMBER(trap); printk( "Unexpected trap (%2d) at address 0x%08x\n", real_trap, isf->tpc); switch (real_trap) { /* * First the ones defined by the basic architecture */ case 0x00: printk( "reset\n" ); break; case 0x01: printk( "instruction access exception\n" ); break; case 0x02: printk( "illegal instruction\n" ); break; case 0x03: printk( "privileged instruction\n" ); break; case 0x04: printk( "fp disabled\n" ); break; case 0x07: printk( "memory address not aligned\n" ); break; case 0x08: printk( "fp exception\n" ); break; case 0x09: printk("data access exception at 0x%08x\n", LEON_REG.Failed_Address ); break; case 0x0A: printk( "tag overflow\n" ); break; /* * Then the ones defined by the LEON in particular */ case LEON_TRAP_TYPE( LEON_INTERRUPT_CORRECTABLE_MEMORY_ERROR ): printk( "LEON_INTERRUPT_CORRECTABLE_MEMORY_ERROR\n" ); break; case LEON_TRAP_TYPE( LEON_INTERRUPT_UART_2_RX_TX ): printk( "LEON_INTERRUPT_UART_2_RX_TX\n" ); break; case LEON_TRAP_TYPE( LEON_INTERRUPT_UART_1_RX_TX ): printk( "LEON_INTERRUPT_UART_1_RX_TX\n" ); break; case LEON_TRAP_TYPE( LEON_INTERRUPT_EXTERNAL_0 ): printk( "LEON_INTERRUPT_EXTERNAL_0\n" ); break; case LEON_TRAP_TYPE( LEON_INTERRUPT_EXTERNAL_1 ): printk( "LEON_INTERRUPT_EXTERNAL_1\n" ); break; case LEON_TRAP_TYPE( LEON_INTERRUPT_EXTERNAL_2 ): printk( "LEON_INTERRUPT_EXTERNAL_2\n" ); break; case LEON_TRAP_TYPE( LEON_INTERRUPT_EXTERNAL_3 ): printk( "LEON_INTERRUPT_EXTERNAL_3\n" ); break; case LEON_TRAP_TYPE( LEON_INTERRUPT_TIMER1 ): printk( "LEON_INTERRUPT_TIMER1\n" ); break; case LEON_TRAP_TYPE( LEON_INTERRUPT_TIMER2 ): printk( "LEON_INTERRUPT_TIMER2\n" ); break; default: break; } /* * What else can we do but stop ... */ asm volatile( "mov 1, %g1; ta 0x0" ); }
void _CPU_Exception_frame_print( const CPU_Exception_frame *frame ) { uint32_t trap; uint32_t real_trap; const CPU_Interrupt_frame *isf; trap = frame->trap; real_trap = SPARC_REAL_TRAP_NUMBER(trap); isf = frame->isf; printk( "Unexpected trap (%2d) at address 0x%08x\n", real_trap, isf->tpc); switch (real_trap) { /* * First the ones defined by the basic architecture */ case 0x00: printk( "reset\n" ); break; case 0x01: printk( "instruction access exception\n" ); break; case 0x02: printk( "illegal instruction\n" ); break; case 0x03: printk( "privileged instruction\n" ); break; case 0x04: printk( "fp disabled\n" ); break; case 0x07: printk( "memory address not aligned\n" ); break; case 0x08: printk( "fp exception\n" ); break; case 0x09: printk("data access exception at 0x%08x\n", LEON_REG.Failed_Address ); break; case 0x0A: printk( "tag overflow\n" ); break; /* * Then the ones defined by the LEON in particular */ case LEON_TRAP_TYPE( LEON_INTERRUPT_CORRECTABLE_MEMORY_ERROR ): printk( "LEON_INTERRUPT_CORRECTABLE_MEMORY_ERROR\n" ); break; case LEON_TRAP_TYPE( LEON_INTERRUPT_UART_2_RX_TX ): printk( "LEON_INTERRUPT_UART_2_RX_TX\n" ); break; case LEON_TRAP_TYPE( LEON_INTERRUPT_UART_1_RX_TX ): printk( "LEON_INTERRUPT_UART_1_RX_TX\n" ); break; case LEON_TRAP_TYPE( LEON_INTERRUPT_EXTERNAL_0 ): printk( "LEON_INTERRUPT_EXTERNAL_0\n" ); break; case LEON_TRAP_TYPE( LEON_INTERRUPT_EXTERNAL_1 ): printk( "LEON_INTERRUPT_EXTERNAL_1\n" ); break; case LEON_TRAP_TYPE( LEON_INTERRUPT_EXTERNAL_2 ): printk( "LEON_INTERRUPT_EXTERNAL_2\n" ); break; case LEON_TRAP_TYPE( LEON_INTERRUPT_EXTERNAL_3 ): printk( "LEON_INTERRUPT_EXTERNAL_3\n" ); break; case LEON_TRAP_TYPE( LEON_INTERRUPT_TIMER1 ): printk( "LEON_INTERRUPT_TIMER1\n" ); break; case LEON_TRAP_TYPE( LEON_INTERRUPT_TIMER2 ): printk( "LEON_INTERRUPT_TIMER2\n" ); break; default: break; } }
/* * $Id: leon_smc91111.c,v 1.6 2009/11/29 15:33:27 ralf Exp $ */ #include <bsp.h> #include <libchip/smc91111exp.h> #include <rtems/bspIo.h> #define SMC91111_BASE_ADDR (void*)0x20000300 #define SMC91111_BASE_IRQ 4 #define SMC91111_BASE_PIO 4 scmv91111_configuration_t leon_scmv91111_configuration = { SMC91111_BASE_ADDR, /* base address */ LEON_TRAP_TYPE (SMC91111_BASE_IRQ), /* vector number */ SMC91111_BASE_PIO, /* PIO */ 100, /* 100b */ 1, /* fulldx */ 1 /* autoneg */ }; int _rtems_smc91111_driver_attach (struct rtems_bsdnet_ifconfig *config, scmv91111_configuration_t * scm_config); /* * Attach an SMC91111 driver to the system */ int rtems_smc91111_driver_attach_leon3 (struct rtems_bsdnet_ifconfig *config, int attach)