summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libcpu/sh/shgdb/score/cpu_asm.c
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2008-09-25 19:32:15 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2008-09-25 19:32:15 +0000
commitbe7ca346fd7771e8fb7483d86877eb480b1a0c69 (patch)
tree4dd5720611eec83dfac8abc2b3433ecbb57bcf1b /c/src/lib/libcpu/sh/shgdb/score/cpu_asm.c
parent2008-09-25 Joel Sherrill <joel.sherrill@oarcorp.com> (diff)
downloadrtems-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.c83
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();
+ }
+}