diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2008-09-25 19:32:15 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2008-09-25 19:32:15 +0000 |
commit | be7ca346fd7771e8fb7483d86877eb480b1a0c69 (patch) | |
tree | 4dd5720611eec83dfac8abc2b3433ecbb57bcf1b /c/src/lib/libcpu/sh/shgdb/score/cpu_asm.c | |
parent | 2008-09-25 Joel Sherrill <joel.sherrill@oarcorp.com> (diff) | |
download | rtems-be7ca346fd7771e8fb7483d86877eb480b1a0c69.tar.bz2 |
2008-09-25 Joel Sherrill <joel.sherrill@oarcorp.com>
* Makefile.am, configure.ac, sh7032/score/cpu_asm.c,
sh7045/score/cpu_asm.c, sh7750/score/cpu_asm.c: Move duplicated
context switch code to score/cpu and provide an interrupt handling
stub for the GDB SuperH simulator since it does not support
interrupts or devices. This has been used to run tests on the
simulator BSP as SH1, SH2, and SH4.
* shgdb/score/cpu_asm.c, shgdb/score/ispshgdb.c: New files.
Diffstat (limited to '')
-rw-r--r-- | c/src/lib/libcpu/sh/shgdb/score/cpu_asm.c | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/c/src/lib/libcpu/sh/shgdb/score/cpu_asm.c b/c/src/lib/libcpu/sh/shgdb/score/cpu_asm.c new file mode 100644 index 0000000000..210e4ee1f4 --- /dev/null +++ b/c/src/lib/libcpu/sh/shgdb/score/cpu_asm.c @@ -0,0 +1,83 @@ +/* + * Support for SuperH Simulator in GDB + * + * COPYRIGHT (c) 1989-2008. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ + +#include <rtems/system.h> +#include <rtems/score/cpu.h> +#include <rtems/score/isr.h> +#include <rtems/score/thread.h> +#include <rtems/score/sh.h> + +#if( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE) + unsigned long *_old_stack_ptr; +#endif + +register unsigned long *stack_ptr asm("r15"); + +/* + * This routine provides the RTEMS interrupt management. + */ + +void __ISR_Handler( uint32_t vector) +{ + ISR_Level level; + + _ISR_Disable( level ); + + _Thread_Dispatch_disable_level++; + +#if( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE) + if( _ISR_Nest_level == 0 ) + { + /* Install irq stack */ + _old_stack_ptr = stack_ptr; + stack_ptr = _CPU_Interrupt_stack_high; + } + +#endif + + _ISR_Nest_level++; + + _ISR_Enable( level ); + + /* call isp */ + if( _ISR_Vector_table[ vector]) + (*_ISR_Vector_table[ vector ])( vector ); + + _ISR_Disable( level ); + + _Thread_Dispatch_disable_level--; + + _ISR_Nest_level--; + +#if( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE) + + if( _ISR_Nest_level == 0 ) + /* restore old stack pointer */ + stack_ptr = _old_stack_ptr; +#endif + + _ISR_Enable( level ); + + if ( _ISR_Nest_level ) + return; + + if ( _Thread_Dispatch_disable_level ) { + _ISR_Signals_to_thread_executing = FALSE; + return; + } + + if ( _Context_Switch_necessary || _ISR_Signals_to_thread_executing ) { + _ISR_Signals_to_thread_executing = FALSE; + _Thread_Dispatch(); + } +} |