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

4.115
Last change on this file since 03b7789 was 03b7789, checked in by Sebastian Huber <sebastian.huber@…>, on 04/26/14 at 13:09:10

score: Statically initialize _ISR_Vector_table

  • Property mode set to 100644
File size: 4.2 KB
RevLine 
[5532553]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:
[5bb38e15]6 *
[5532553]7 *  COPYRIGHT (c) 1989-1999.
8 *  On-Line Applications Research Corporation (OAR).
[5bb38e15]9 *
[5532553]10 *  The license and distribution terms for this file may be
11 *  found in the file LICENSE in this distribution or at
[c499856]12 *  http://www.rtems.org/license/LICENSE.
[5532553]13 */
14
[febaa8a]15#ifdef HAVE_CONFIG_H
16#include "config.h"
17#endif
18
[1ef0afe6]19#include <rtems/asm.h>
20#include <rtems/score/percpu.h>
[5532553]21
22;.equ   RUNCONTEXT_ARG,  er0
23;.equ   HEIRCONTEXT_ARG, er1
24       
[5bb38e15]25/*
[5532553]26 *  Make sure we tell the assembler what type of CPU model we are
27 *  being compiled for.
[5bb38e15]28 */
[5532553]29
30#if defined(__H8300H__)
[fb31e1a2]31        .h8300h
[5532553]32#endif
[5bb38e15]33#if defined(__H8300S__)
[fb31e1a2]34        .h8300s
[f389307]35#endif
[5bb38e15]36#if defined(__H8300SX__)
[f389307]37        .h8300sx
[5532553]38#endif
[fb31e1a2]39        .text
[5532553]40
[fb31e1a2]41        .text
[5532553]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
[fb31e1a2]53
[1ef0afe6]54        .global SYM(_CPU_Context_switch)
[fb31e1a2]55
[1ef0afe6]56SYM(_CPU_Context_switch):
[5532553]57        /* Save Context */
[f1cf019]58#if defined(__H8300H__) || defined(__H8300S__) || defined(__H8300SX__)
[fb31e1a2]59        stc.w   ccr,@(0:16,er0)
[5532553]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
[fb31e1a2]76        ldc.w   @(0:16,er1),ccr
[54ba5aa]77#endif
[fb31e1a2]78
[5532553]79        rts
80
81        .align 2
[fb31e1a2]82
[1ef0afe6]83        .global SYM(_CPU_Context_restore)
[fb31e1a2]84
[1ef0afe6]85SYM(_CPU_Context_restore):
[fb31e1a2]86       
[f1cf019]87#if defined(__H8300H__) || defined(__H8300S__) || defined(__H8300SX__)
[54ba5aa]88        mov.l   er0,er1
[fb31e1a2]89        jmp             @restore:24
[54ba5aa]90#endif
[5532553]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
[1ef0afe6]103        .global SYM(_ISR_Handler)
104        .extern SYM(_Vector_table)
[5532553]105
106       
[1ef0afe6]107SYM(_ISR_Handler):
[f1cf019]108#if defined(__H8300H__) || defined(__H8300S__) || defined(__H8300SX__)
[5532553]109        mov.l   er1,@-er7
110        mov.l   er2,@-er7
111        mov.l   er3,@-er7
112        mov.l   er4,@-er7
113        mov.l   er5,@-er7
114        mov.l   er6,@-er7
115       
116/*  Set IRQ Stack */
[fb31e1a2]117        orc             #0xc0,ccr
[5532553]118        mov.l   er7,er6         ; save stack pointer
[1ef0afe6]119        mov.l   @ISR_NEST_LEVEL,er1
[5532553]120        bne             nested
[1ef0afe6]121        mov.l   @INTERRUPT_STACK_HIGH,er7
[5532553]122       
123nested:
124        mov.l   er6,@-er7       ; save sp so pop regardless of nest level
125       
[5bb38e15]126;; Inc  system counters
[1ef0afe6]127        mov.l   @ISR_NEST_LEVEL,er1
[5532553]128        inc.l   #1,er1
[1ef0afe6]129        mov.l   er1,@ISR_NEST_LEVEL
[d19cce29]130        mov.l   @THREAD_DISPATCH_DISABLE_LEVEL,er1
[5532553]131        inc.l   #1,er1
[d19cce29]132        mov.l   er1,@THREAD_DISPATCH_DISABLE_LEVEL
[5532553]133       
134/* Vector to ISR */
135
136        mov             er0,er2 ; copy vector
137        shll.l  er2
138        shll.l  er2             ; vector = vector * 4 (sizeof(int))
[03b7789]139        mov.l   @(SYM(_ISR_Vector_table), er2),er1
[5532553]140        jsr             @er1    ; er0 = arg1 =vector
141       
[fb31e1a2]142        orc             #0xc0,ccr
[1ef0afe6]143        mov.l   @ISR_NEST_LEVEL,er1
[5532553]144        dec.l   #1,er1
[1ef0afe6]145        mov.l   er1,@ISR_NEST_LEVEL
[d19cce29]146        mov.l   @THREAD_DISPATCH_DISABLE_LEVEL,er1
[5532553]147        dec.l   #1,er1
[d19cce29]148        mov.l   er1,@THREAD_DISPATCH_DISABLE_LEVEL
[1ef0afe6]149        bne     exit
[5532553]150       
[1ef0afe6]151        mov.b   @DISPATCH_NEEDED,er1
152        beq     exit            ; If no then exit
[5532553]153
154        /* Context switch here through ISR_Dispatch */
155bframe:
[1ef0afe6]156        orc     #0xc0,ccr
[5532553]157/*      Pop Stack       */
[1ef0afe6]158        mov     @er7+,er6
159        mov     er6,er7
[5532553]160
161        /* Set up IRQ stack frame and dispatch to _ISR_Dispatch */
162       
[fb31e1a2]163        mov.l   #0xc0000000,er2         /* Disable IRQ */
[1ef0afe6]164        or.l    #SYM(_ISR_Dispatch),er2
[5532553]165        mov.l   er2,@-er7
166        rte
167
168/*      Inner IRQ Return, pop flags and return */
169exit:
170/*      Pop Stack       */
171        orc             #0x80,ccr
172        mov             @er7+,er6
173        mov             er6,er7
174        mov             @er7+,er6
175        mov             @er7+,er5
176        mov             @er7+,er4
177        mov             @er7+,er3
178        mov             @er7+,er2
179        mov             @er7+,er1
180        mov             @er7+,er0
[54ba5aa]181#endif
[5532553]182        rte
183       
184/*
185        Called from ISR_Handler as a way of ending IRQ
186        but allowing dispatch to another task.
187        Must use RTE as CCR is still on stack but IRQ has been serviced.       
188        CCR and PC occupy same word so rte can be used.
[fb31e1a2]189        now using task stack
[5532553]190*/
191
192        .align 2
[1ef0afe6]193        .global SYM(_ISR_Dispatch)
[5532553]194
[1ef0afe6]195SYM(_ISR_Dispatch):
[fb31e1a2]196       
[f1cf019]197#if defined(__H8300H__) || defined(__H8300S__) || defined(__H8300SX__)
[1ef0afe6]198        jsr             @SYM(_Thread_Dispatch)
[5532553]199        mov             @er7+,er6
200        mov             @er7+,er5
201        mov             @er7+,er4
202        mov             @er7+,er3
203        mov             @er7+,er2
204        mov             @er7+,er1
205        mov             @er7+,er0
[54ba5aa]206#endif
[5532553]207        rte
208       
209
210        .align 2
[1ef0afe6]211        .global SYM(_CPU_Context_save_fp)
[5532553]212
[1ef0afe6]213SYM(_CPU_Context_save_fp):
[5532553]214        rts
215
216
217        .align 2
[1ef0afe6]218        .global SYM(_CPU_Context_restore_fp)
[5532553]219
[1ef0afe6]220SYM(_CPU_Context_restore_fp):
[5532553]221        rts
Note: See TracBrowser for help on using the repository browser.