summaryrefslogtreecommitdiffstats
path: root/cpukit/score/cpu/v850/cpu_asm.S
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/score/cpu/v850/cpu_asm.S')
-rw-r--r--cpukit/score/cpu/v850/cpu_asm.S213
1 files changed, 213 insertions, 0 deletions
diff --git a/cpukit/score/cpu/v850/cpu_asm.S b/cpukit/score/cpu/v850/cpu_asm.S
new file mode 100644
index 0000000000..d96e3bac2c
--- /dev/null
+++ b/cpukit/score/cpu/v850/cpu_asm.S
@@ -0,0 +1,213 @@
+/**
+ * @file
+ *
+ * This file contains the basic algorithms for all assembly code used
+ * in an specific CPU port of RTEMS. These algorithms must be implemented
+ * in assembly language
+ */
+
+/*
+ * COPYRIGHT (c) 1989-2012.
+ * 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#if 0
+/**
+ * This routine is responsible for saving the FP context
+ * at *fp_context_ptr. If the point to load the FP context
+ * from is changed then the pointer is modified by this routine.
+ *
+ * Sometimes a macro implementation of this is in cpu.h which dereferences
+ * the ** and a similarly named routine in this file is passed something
+ * like a (Context_Control_fp *). The general rule on making this decision
+ * is to avoid writing assembly language.
+ *
+ * v850 Specific Information:
+ *
+ * The v850 appears to always have soft float.
+ */
+void _CPU_Context_save_fp(
+ Context_Control_fp **fp_context_ptr
+)
+{
+}
+
+/**
+ * This routine is responsible for restoring the FP context
+ * at *fp_context_ptr. If the point to load the FP context
+ * from is changed then the pointer is modified by this routine.
+ *
+ * Sometimes a macro implementation of this is in cpu.h which dereferences
+ * the ** and a similarly named routine in this file is passed something
+ * like a (Context_Control_fp *). The general rule on making this decision
+ * is to avoid writing assembly language.
+ *
+ * v850 Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+void _CPU_Context_restore_fp(
+ Context_Control_fp **fp_context_ptr
+)
+{
+}
+#endif
+
+/**
+ * This routine performs a normal non-FP context switch.
+ *
+ * v850 Specific Information:
+ *
+ * + r6 - running thread
+ * + r7 - heir thread
+ */
+#define V850_CONTEXT_CONTROL_R1_OFFSET 0
+#define V850_CONTEXT_CONTROL_R3_OFFSET 4
+#define V850_CONTEXT_CONTROL_R20_OFFSET 8
+#define V850_CONTEXT_CONTROL_R21_OFFSET 12
+#define V850_CONTEXT_CONTROL_R22_OFFSET 16
+#define V850_CONTEXT_CONTROL_R23_OFFSET 20
+#define V850_CONTEXT_CONTROL_R24_OFFSET 24
+#define V850_CONTEXT_CONTROL_R25_OFFSET 28
+#define V850_CONTEXT_CONTROL_R26_OFFSET 32
+#define V850_CONTEXT_CONTROL_R27_OFFSET 36
+#define V850_CONTEXT_CONTROL_R28_OFFSET 40
+#define V850_CONTEXT_CONTROL_R29_OFFSET 44
+#define V850_CONTEXT_CONTROL_R31_OFFSET 48
+#define V850_CONTEXT_CONTROL_PSW_OFFSET 52
+
+ .section .text
+ .global __CPU_Context_switch
+ .type __CPU_Context_switch, @function
+__CPU_Context_switch:
+ st.w r1,V850_CONTEXT_CONTROL_R1_OFFSET[r6]
+ st.w r3,V850_CONTEXT_CONTROL_R3_OFFSET[r6]
+ st.w r20,V850_CONTEXT_CONTROL_R20_OFFSET[r6]
+ st.w r21,V850_CONTEXT_CONTROL_R21_OFFSET[r6]
+ st.w r22,V850_CONTEXT_CONTROL_R22_OFFSET[r6]
+ st.w r23,V850_CONTEXT_CONTROL_R23_OFFSET[r6]
+ st.w r24,V850_CONTEXT_CONTROL_R24_OFFSET[r6]
+ st.w r25,V850_CONTEXT_CONTROL_R25_OFFSET[r6]
+ st.w r26,V850_CONTEXT_CONTROL_R27_OFFSET[r6]
+ st.w r27,V850_CONTEXT_CONTROL_R27_OFFSET[r6]
+ st.w r28,V850_CONTEXT_CONTROL_R28_OFFSET[r6]
+ st.w r29,V850_CONTEXT_CONTROL_R29_OFFSET[r6]
+ st.w r31,V850_CONTEXT_CONTROL_R31_OFFSET[r6]
+ stsr psw,r21
+ st.w r21,V850_CONTEXT_CONTROL_PSW_OFFSET[r6]
+restore:
+ ld.w V850_CONTEXT_CONTROL_R1_OFFSET[r7],r1
+ ld.w V850_CONTEXT_CONTROL_R3_OFFSET[r7],r3
+ ld.w V850_CONTEXT_CONTROL_R20_OFFSET[r7],r20
+ ld.w V850_CONTEXT_CONTROL_R21_OFFSET[r7],r21
+ ld.w V850_CONTEXT_CONTROL_R22_OFFSET[r7],r22
+ ld.w V850_CONTEXT_CONTROL_R23_OFFSET[r7],r23
+ ld.w V850_CONTEXT_CONTROL_R24_OFFSET[r7],r24
+ ld.w V850_CONTEXT_CONTROL_R25_OFFSET[r7],r25
+ ld.w V850_CONTEXT_CONTROL_R27_OFFSET[r7],r26
+ ld.w V850_CONTEXT_CONTROL_R27_OFFSET[r7],r27
+ ld.w V850_CONTEXT_CONTROL_R28_OFFSET[r7],r28
+ ld.w V850_CONTEXT_CONTROL_R29_OFFSET[r7],r29
+ ld.w V850_CONTEXT_CONTROL_R31_OFFSET[r7],r31
+ ld.w V850_CONTEXT_CONTROL_PSW_OFFSET[r7],r7
+ ldsr r7,psw
+ jmp [r31]
+
+
+/**
+ * This routine is generally used only to restart self in an
+ * efficient manner. It may simply be a label in _CPU_Context_switch.
+ *
+ * NOTE: May be unnecessary to reload some registers.
+ *
+ * v850 Specific Information:
+ *
+ * Move second parameter to first and jump to normal restore
+ */
+ .section .text
+ .global __CPU_Context_restore
+ .type __CPU_Context_restore, @function
+__CPU_Context_restore:
+ mov r6, r7 /* move to second parameter register */
+ br restore
+
+#if 0
+/**
+ * This routine provides the RTEMS interrupt management.
+ *
+ * v850 Specific Information:
+ *
+ * XXX document implementation including references if appropriate
+ */
+void _ISR_Handler(void); /* C warning avoidance */
+void _ISR_Handler(void)
+{
+ /*
+ * This discussion ignores a lot of the ugly details in a real
+ * implementation such as saving enough registers/state to be
+ * able to do something real. Keep in mind that the goal is
+ * to invoke a user's ISR handler which is written in C and
+ * uses a certain set of registers.
+ *
+ * Also note that the exact order is to a large extent flexible.
+ * Hardware will dictate a sequence for a certain subset of
+ * _ISR_Handler while requirements for setting
+ */
+
+ /*
+ * At entry to "common" _ISR_Handler, the vector number must be
+ * available. On some CPUs the hardware puts either the vector
+ * number or the offset into the vector table for this ISR in a
+ * known place. If the hardware does not give us this information,
+ * then the assembly portion of RTEMS for this port will contain
+ * a set of distinct interrupt entry points which somehow place
+ * the vector number in a known place (which is safe if another
+ * interrupt nests this one) and branches to _ISR_Handler.
+ *
+ * save some or all context on stack
+ * may need to save some special interrupt information for exit
+ *
+ * #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
+ * if ( _ISR_Nest_level == 0 )
+ * switch to software interrupt stack
+ * #endif
+ *
+ * _ISR_Nest_level++;
+ *
+ * _Thread_Dispatch_disable_level++;
+ *
+ * (*_ISR_Vector_table[ vector ])( vector );
+ *
+ * _Thread_Dispatch_disable_level--;
+ *
+ * --_ISR_Nest_level;
+ *
+ * if ( _ISR_Nest_level )
+ * goto the label "exit interrupt (simple case)"
+ *
+ * if ( _Thread_Dispatch_disable_level )
+ * goto the label "exit interrupt (simple case)"
+ *
+ * if ( _Thread_Dispatch_necessary ) {
+ * call _Thread_Dispatch() or prepare to return to _ISR_Dispatch
+ * prepare to get out of interrupt
+ * return from interrupt (maybe to _ISR_Dispatch)
+ *
+ * LABEL "exit interrupt (simple case):
+ * #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
+ * if outermost interrupt
+ * restore stack
+ * #endif
+ * prepare to get out of interrupt
+ * return from interrupt
+ */
+}
+#endif