source: rtems/cpukit/score/cpu/h8300/cpu_asm.S @ febaa8a

4.104.11
Last change on this file since febaa8a was febaa8a, checked in by Joel Sherrill <joel.sherrill@…>, on Mar 27, 2010 at 3:03:09 PM

2010-03-27 Joel Sherrill <joel.sherrill@…>

  • cpu.c, cpu_asm.S: Add include of config.h
  • Property mode set to 100644
File size: 4.4 KB
Line 
1/*
2 * Hitachi H8 Score CPU functions
3 *   Copyright Comnet Technologies Ltd 1999
4 *
5 *  Based on example code and other ports with this copyright:
6 *
7 *  COPYRIGHT (c) 1989-1999.
8 *  On-Line Applications Research Corporation (OAR).
9 *
10 *  The license and distribution terms for this file may be
11 *  found in the file LICENSE in this distribution or at
12 *  http://www.rtems.com/license/LICENSE.
13 *
14 *  $Id$
15 */
16
17#ifdef HAVE_CONFIG_H
18#include "config.h"
19#endif
20
21
22;.equ   RUNCONTEXT_ARG,  er0
23;.equ   HEIRCONTEXT_ARG, er1
24       
25/*
26 *  Make sure we tell the assembler what type of CPU model we are
27 *  being compiled for.
28 */
29
30#if defined(__H8300H__)
31        .h8300h
32#endif
33#if defined(__H8300S__)
34        .h8300s
35#endif
36#if defined(__H8300SX__)
37        .h8300sx
38#endif
39        .text
40
41        .text
42/*
43        GCC Compiled with optimisations and Wimplicit decs to ensure
44    that stack from doesn't change
45       
46        Supposedly R2 and R3 do not need to be saved but who knows
47       
48        Arg1 = er0      (not on stack)
49        Arg2 = er1      (not on stack)
50*/
51
52        .align 2
53
54        .global __CPU_Context_switch
55
56__CPU_Context_switch:
57        /* Save Context */
58#if defined(__H8300H__) || defined(__H8300S__) || defined(__H8300SX__)
59        stc.w   ccr,@(0:16,er0)
60        mov.l   er7,@(2:16,er0)
61        mov.l   er6,@(6:16,er0)
62        mov.l   er5,@(10:16,er0)
63        mov.l   er4,@(14:16,er0)
64        mov.l   er3,@(18:16,er0)
65        mov.l   er2,@(22:16,er0)
66
67        /* Install New context */
68
69restore:
70        mov.l   @(22:16,er1),er2
71        mov.l   @(18:16,er1),er3
72        mov.l   @(14:16,er1),er4
73        mov.l   @(10:16,er1),er5
74        mov.l   @(6:16,er1),er6
75        mov.l   @(2:16,er1),er7
76        ldc.w   @(0:16,er1),ccr
77#endif
78
79        rts
80
81        .align 2
82
83        .global __CPU_Context_restore
84
85__CPU_Context_restore:
86       
87#if defined(__H8300H__) || defined(__H8300S__) || defined(__H8300SX__)
88        mov.l   er0,er1
89        jmp             @restore:24
90#endif
91
92
93
94/*
95        VHandler for Vectored Interrupts
96       
97        All IRQ's are vectored to routine _ISR_#vector_number
98        This routine stacks er0 and loads er0 with vector number
99        before transferring to here
100       
101*/
102        .align 2
103        .global __ISR_Handler
104        .extern __ISR_Nest_level
105        .extern __Vector_table
106        .extern __Context_switch_necessary
107
108       
109__ISR_Handler:
110#if defined(__H8300H__) || defined(__H8300S__) || defined(__H8300SX__)
111        mov.l   er1,@-er7
112        mov.l   er2,@-er7
113        mov.l   er3,@-er7
114        mov.l   er4,@-er7
115        mov.l   er5,@-er7
116        mov.l   er6,@-er7
117       
118/*  Set IRQ Stack */
119        orc             #0xc0,ccr
120        mov.l   er7,er6         ; save stack pointer
121        mov.l   @__ISR_Nest_level,er1
122        bne             nested
123        mov.l   @__CPU_Interrupt_stack_high,er7
124       
125nested:
126        mov.l   er6,@-er7       ; save sp so pop regardless of nest level
127       
128;; Inc  system counters
129        mov.l   @__ISR_Nest_level,er1
130        inc.l   #1,er1
131        mov.l   er1,@__ISR_Nest_level
132        mov.l   @__Thread_Dispatch_disable_level,er1
133        inc.l   #1,er1
134        mov.l   er1,@__Thread_Dispatch_disable_level
135       
136/* Vector to ISR */
137
138        mov.l   @__ISR_Vector_table,er1
139        mov             er0,er2 ; copy vector
140        shll.l  er2
141        shll.l  er2             ; vector = vector * 4 (sizeof(int))
142        add.l   er2,er1
143    mov.l       @er1,er1
144        jsr             @er1    ; er0 = arg1 =vector
145       
146        orc             #0xc0,ccr
147        mov.l   @__ISR_Nest_level,er1
148        dec.l   #1,er1
149        mov.l   er1,@__ISR_Nest_level
150        mov.l   @__Thread_Dispatch_disable_level,er1
151        dec.l   #1,er1
152        mov.l   er1,@__Thread_Dispatch_disable_level
153        bne             exit
154       
155        mov.b   @__Context_Switch_necessary,er1
156        bne             bframe          ; If yes then dispatch next task
157       
158        mov.b   @__ISR_Signals_to_thread_executing,er1
159        beq             exit            ; If no signals waiting
160
161        /* Context switch here through ISR_Dispatch */
162       
163bframe:
164        orc             #0xc0,ccr
165/*      Pop Stack       */
166        mov             @er7+,er6
167        mov             er6,er7
168        mov.l   #0,er2
169        mov.l   er2,@__ISR_Signals_to_thread_executing
170
171        /* Set up IRQ stack frame and dispatch to _ISR_Dispatch */
172       
173        mov.l   #0xc0000000,er2         /* Disable IRQ */
174        or.l    #_ISR_Dispatch,er2
175        mov.l   er2,@-er7
176        rte
177
178/*      Inner IRQ Return, pop flags and return */
179exit:
180/*      Pop Stack       */
181        orc             #0x80,ccr
182        mov             @er7+,er6
183        mov             er6,er7
184        mov             @er7+,er6
185        mov             @er7+,er5
186        mov             @er7+,er4
187        mov             @er7+,er3
188        mov             @er7+,er2
189        mov             @er7+,er1
190        mov             @er7+,er0
191#endif
192        rte
193       
194/*
195        Called from ISR_Handler as a way of ending IRQ
196        but allowing dispatch to another task.
197        Must use RTE as CCR is still on stack but IRQ has been serviced.       
198        CCR and PC occupy same word so rte can be used.
199        now using task stack
200*/
201
202        .align 2
203        .global _ISR_Dispatch
204
205_ISR_Dispatch:
206       
207#if defined(__H8300H__) || defined(__H8300S__) || defined(__H8300SX__)
208        jsr             @__Thread_Dispatch
209        mov             @er7+,er6
210        mov             @er7+,er5
211        mov             @er7+,er4
212        mov             @er7+,er3
213        mov             @er7+,er2
214        mov             @er7+,er1
215        mov             @er7+,er0
216#endif
217        rte
218       
219
220        .align 2
221        .global __CPU_Context_save_fp
222
223__CPU_Context_save_fp:
224        rts
225
226
227        .align 2
228        .global __CPU_Context_restore_fp
229
230__CPU_Context_restore_fp:
231        rts
Note: See TracBrowser for help on using the repository browser.