source: rtems/c/src/lib/libcpu/sh/sh7750/score/ispsh7750.c @ c499856

4.115
Last change on this file since c499856 was c499856, checked in by Chris Johns <chrisj@…>, on 03/20/14 at 21:10:47

Change all references of rtems.com to rtems.org.

  • Property mode set to 100644
File size: 9.2 KB
Line 
1/*
2 * SH7750 interrupt support.
3 *
4 * Copyright (C) 2001 OKTET Ltd., St.-Petersburg, Russia
5 * Author: Victor V. Vengerov <vvv@oktet.ru>
6 *
7 *  Based on work:
8 *  Authors: Ralf Corsepius (corsepiu@faw.uni-ulm.de) and
9 *           Bernd Becker (becker@faw.uni-ulm.de)
10 *
11 *  COPYRIGHT (c) 1997-1998, FAW Ulm, Germany
12 *
13 *  This program is distributed in the hope that it will be useful,
14 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE
16 *
17 *
18 *  COPYRIGHT (c) 1998.
19 *  On-Line Applications Research Corporation (OAR).
20 *
21 *  The license and distribution terms for this file may be
22 *  found in the file LICENSE in this distribution or at
23 *  http://www.rtems.org/license/LICENSE.
24 *
25 *      Modified to reflect isp entries for sh7045 processor:
26 *      John M. Mills (jmills@tga.com)
27 *      TGA Technologies, Inc.
28 *      100 Pinnacle Way, Suite 140
29 *      Norcross, GA 30071 U.S.A.
30 *      August, 1999
31 *
32 *      This modified file may be copied and distributed in accordance
33 *      the above-referenced license. It is provided for critique and
34 *      developmental purposes without any warranty nor representation
35 *      by the authors or by TGA Technologies.
36 */
37
38#include <rtems/system.h>
39#include <rtems/score/types.h>
40#include <rtems/score/isr.h>
41
42/*
43 * This is a exception vector table
44 *
45 * It has the same structure as the actual vector table (vectab)
46 */
47
48
49#include <rtems/score/ispsh7750.h>
50#include <rtems/score/sh4_regs.h>
51#include <rtems/score/sh7750_regs.h>
52
53/* VBR register contents saved on startup -- used to hook exception by debug
54 * agent */
55void *_VBR_Saved;
56
57#define __STRINGIFY1__(x) #x
58#define __STRINGIFY__(x) __STRINGIFY1__(x)
59
60#define STOP_TIMER \
61     "        mov.l TSTR_k,r0      \n"                             \
62     "        mov.b @r0,r1         \n"                             \
63     "        and   #" __STRINGIFY__(~SH7750_TSTR_STR0) ",r1\n"    \
64     "        mov.b r1,@r0         \n"
65
66#define START_TIMER \
67     "        mov.l TSTR_k,r0      \n"                             \
68     "        mov.b @r0,r1         \n"                             \
69     "        or    #" __STRINGIFY__(SH7750_TSTR_STR0) ",r1\n"     \
70     "        mov.b r1,@r0         \n"
71
72__asm__ ("        .text\n"
73     "        .balign 256\n"
74     "        .global __vbr_base\n"
75     "__vbr_base:\n"
76     "        .org __vbr_base + 0x100\n"
77     "vbr_100:\n"
78     "        mov.l  r0,@-r15\n"
79     "        mov.l  r1,@-r15\n"
80     "        mov.l  __VBR_Saved100_k, r0\n"
81     "        mov.l  offset100_k,r1\n"
82     "        mov.l  @r0,r0\n"
83     "        add    r1,r0\n"
84     "        mov.l  @r15+,r1\n"
85     "        jmp    @r0\n"
86     "        mov.l  @r15+,r0\n"
87     "        .align 2\n"
88     "__VBR_Saved100_k:\n"
89     "        .long __VBR_Saved\n"
90     "offset100_k:\n"
91     "        .long  0x100\n"
92
93     "        .org __vbr_base + 0x400\n"
94     "vbr_400:\n"
95     "        mov.l  r0,@-r15\n"
96     "        mov.l  r1,@-r15\n"
97     "        mov.l  __VBR_Saved400_k, r0\n"
98     "        mov.l  offset400_k,r1\n"
99     "        mov.l  @r0,r0\n"
100     "        add    r1,r0\n"
101     "        mov.l  @r15+,r1\n"
102     "        jmp    @r0\n"
103     "        mov.l  @r15+,r0\n"
104     "        .align 2\n"
105     "__VBR_Saved400_k:\n"
106     "        .long __VBR_Saved\n"
107     "offset400_k:\n"
108     "        .long  0x400\n"
109
110     "        .org __vbr_base + 0x600\n"
111     "vbr_600:\n"
112     "    mov.l r0,@-r15   \n"
113     "    mov.l r1,@-r15   \n"
114     "    stc   sr,r0      \n"
115     "    mov.l __vbr_600_sr_and_k,r1\n"
116     "    and   r1,r0      \n"
117     "    mov.l __vbr_600_sr_or_k,r1\n"
118     "    or    r1,r0      \n"
119     "    ldc   r0,sr      \n"
120     "    ldc.l @r15+,r1_bank\n"
121     "    ldc.l @r15+,r0_bank\n"
122     "    mov.l r0,@-r15   \n"
123     "    mov.l r1,@-r15   \n"
124     "    mov.l r2,@-r15   \n"
125     "    mov.l r3,@-r15   \n"
126     "    mov.l r4,@-r15   \n"
127     "    mov.l r5,@-r15   \n"
128     "    mov.l r6,@-r15   \n"
129     "    mov.l r7,@-r15   \n"
130#if 0
131     "    mov.l r8,@-r15   \n"
132     "    mov.l r9,@-r15   \n"
133     "    mov.l r10,@-r15  \n"
134     "    mov.l r11,@-r15  \n"
135     "    mov.l r12,@-r15  \n"
136     "    mov.l r13,@-r15  \n"
137#endif
138     "    mov.l r14,@-r15  \n"
139     "    sts.l fpscr,@-r15\n"
140     "    sts.l fpul,@-r15 \n"
141     "    mov.l __ISR_temp_fpscr_k,r0   \n"
142     "    lds   r0,fpscr   \n"
143     "    fmov  fr0,@-r15  \n"
144     "    fmov  fr1,@-r15  \n"
145     "    fmov  fr2,@-r15  \n"
146     "    fmov  fr3,@-r15  \n"
147     "    fmov  fr4,@-r15  \n"
148     "    fmov  fr5,@-r15  \n"
149     "    fmov  fr6,@-r15  \n"
150     "    fmov  fr7,@-r15  \n"
151     "    fmov  fr8,@-r15  \n"
152     "    fmov  fr9,@-r15  \n"
153     "    fmov  fr10,@-r15 \n"
154     "    fmov  fr11,@-r15 \n"
155     "    fmov  fr12,@-r15 \n"
156     "    fmov  fr13,@-r15 \n"
157     "    fmov  fr14,@-r15 \n"
158     "    fmov  fr15,@-r15 \n"
159
160     "    sts.l pr,@-r15   \n"
161     "    sts.l mach,@-r15 \n"
162     "    sts.l macl,@-r15 \n"
163     "    stc.l spc,@-r15  \n"
164     "    stc.l ssr,@-r15  \n"
165     "    mov r15,r14      \n"
166#if 0
167     "    stc   ssr,r0     \n"
168     "    ldc   r0,sr      \n"
169#endif
170     "    mov.l __ISR_Handler_k, r1\n"
171     "    mov.l _INTEVT_k,r4\n"
172     "    mov.l @r4,r4     \n"
173     "    shlr2 r4         \n"
174     "    shlr  r4         \n"
175
176     "    mov.l _ISR_Table_k,r0\n"
177     "    mov.l @r0,r0     \n"
178     "    add   r4,r0      \n"
179     "    mov.l @r0,r0     \n"
180     "    cmp/eq #0,r0     \n"
181     "    bt    _ipl_hook  \n"
182
183
184     "    jsr @r1          \n"
185     "     shlr2 r4        \n"
186     "    mov   r14,r15    \n"
187     "    ldc.l @r15+,ssr  \n"
188     "    ldc.l @r15+,spc  \n"
189     "    lds.l @r15+,macl \n"
190     "    lds.l @r15+,mach \n"
191     "    lds.l @r15+,pr   \n"
192     "    mov.l __ISR_temp_fpscr_k,r0   \n"
193     "    lds   r0,fpscr   \n"
194
195     "    fmov  @r15+,fr15 \n"
196     "    fmov  @r15+,fr14 \n"
197     "    fmov  @r15+,fr13 \n"
198     "    fmov  @r15+,fr12 \n"
199     "    fmov  @r15+,fr11 \n"
200     "    fmov  @r15+,fr10 \n"
201     "    fmov  @r15+,fr9  \n"
202     "    fmov  @r15+,fr8  \n"
203     "    fmov  @r15+,fr7  \n"
204     "    fmov  @r15+,fr6  \n"
205     "    fmov  @r15+,fr5  \n"
206     "    fmov  @r15+,fr4  \n"
207     "    fmov  @r15+,fr3  \n"
208     "    fmov  @r15+,fr2  \n"
209     "    fmov  @r15+,fr1  \n"
210     "    fmov  @r15+,fr0  \n"
211     "    lds.l @r15+,fpul \n"
212     "    lds.l @r15+,fpscr\n"
213     "    mov.l @r15+,r14  \n"
214#if 0
215     "    mov.l @r15+,r13  \n"
216     "    mov.l @r15+,r12  \n"
217     "    mov.l @r15+,r11  \n"
218     "    mov.l @r15+,r10  \n"
219     "    mov.l @r15+,r9   \n"
220     "    mov.l @r15+,r8   \n"
221#endif
222
223     "    mov.l @r15+,r7   \n"
224     "    mov.l @r15+,r6   \n"
225     "    mov.l @r15+,r5   \n"
226     "    mov.l @r15+,r4   \n"
227     "    mov.l @r15+,r3   \n"
228     "    mov.l @r15+,r2   \n"
229     "    mov.l @r15+,r1   \n"
230     "    mov.l @r15+,r0   \n"
231     "    rte              \n"
232     "    nop              \n"
233     "    .align 2         \n"
234     "__vbr_600_sr_and_k:    \n"
235     "    .long " __STRINGIFY__(~(SH4_SR_RB | SH4_SR_BL)) "\n"
236     "__vbr_600_sr_or_k:     \n"
237     "    .long " __STRINGIFY__(SH4_SR_IMASK) "\n"
238     "__ISR_Handler_k:     \n"
239     "    .long ___ISR_Handler\n"
240     "_INTEVT_k:           \n"
241     "    .long " __STRINGIFY__(SH7750_INTEVT) "\n"
242     "_ISR_Table_k:        \n"
243     "    .long   __ISR_Vector_table\n"
244
245     "_ipl_hook:           \n"
246     "    mov   r14,r15    \n"
247     "    ldc.l @r15+,ssr  \n"
248     "    ldc.l @r15+,spc  \n"
249     "    lds.l @r15+,macl \n"
250     "    lds.l @r15+,mach \n"
251     "    lds.l @r15+,pr   \n"
252     "    mov.l __ISR_temp_fpscr_k,r0   \n"
253     "    lds   r0,fpscr   \n"
254     "    fmov  @r15+,fr15 \n"
255     "    fmov  @r15+,fr14 \n"
256     "    fmov  @r15+,fr13 \n"
257     "    fmov  @r15+,fr12 \n"
258     "    fmov  @r15+,fr11 \n"
259     "    fmov  @r15+,fr10 \n"
260     "    fmov  @r15+,fr9  \n"
261     "    fmov  @r15+,fr8  \n"
262     "    fmov  @r15+,fr7  \n"
263     "    fmov  @r15+,fr6  \n"
264     "    fmov  @r15+,fr5  \n"
265     "    fmov  @r15+,fr4  \n"
266     "    fmov  @r15+,fr3  \n"
267     "    fmov  @r15+,fr2  \n"
268     "    fmov  @r15+,fr1  \n"
269     "    fmov  @r15+,fr0  \n"
270     "    lds.l @r15+,fpul \n"
271     "    lds.l @r15+,fpscr\n"
272     "    mov.l @r15+,r14  \n"
273
274     "    mov.l @r15+,r13  \n"
275     "    mov.l @r15+,r12  \n"
276     "    mov.l @r15+,r11  \n"
277     "    mov.l @r15+,r10  \n"
278     "    mov.l @r15+,r9   \n"
279     "    mov.l @r15+,r8   \n"
280
281
282     "    mov.l @r15+,r7   \n"
283     "    mov.l @r15+,r6   \n"
284     "    mov.l @r15+,r5   \n"
285     "    mov.l @r15+,r4   \n"
286     "    mov.l @r15+,r3   \n"
287     "    mov.l @r15+,r2   \n"
288     "    mov.l  __VBR_Saved600_k, r0\n"
289     "    mov.l  offset600_k,r1\n"
290     "    mov.l  @r0,r0\n"
291     "    add    r1,r0\n"
292     "    mov.l  @r15+,r1\n"
293     "    jmp    @r0\n"
294     "    mov.l  @r15+,r0\n"
295     "    .align 2\n"
296     "__ISR_temp_fpscr_k:  \n"
297     "    .long  " __STRINGIFY__(SH4_FPSCR_PR) " \n"
298     "__VBR_Saved600_k:\n"
299     "        .long __VBR_Saved\n"
300     "offset600_k:\n"
301     "        .long  0x600\n"
302
303 );
304
305
306/************************************************
307 * Dummy interrupt service procedure for
308 * interrupts being not allowed --> Trap 2
309 ************************************************/
310__asm__ (" .section .text\n\
311.global __dummy_isp\n\
312__dummy_isp:\n\
313      mov.l r14,@-r15\n\
314      mov   r15, r14\n\
315      trapa #2\n\
316      mov.l @r15+,r14\n\
317      rte\n\
318      nop");
Note: See TracBrowser for help on using the repository browser.