1 | /* |
---|
2 | * This file contains the isp frames for the user interrupts. |
---|
3 | * From these procedures __ISR_Handler is called with the vector number |
---|
4 | * as argument. |
---|
5 | * |
---|
6 | * __ISR_Handler is kept in a separate file (cpu_asm.c), because a bug in |
---|
7 | * some releases of gcc doesn't properly handle #pragma interrupt, if a |
---|
8 | * file contains both isrs and normal functions. |
---|
9 | * |
---|
10 | * Authors: Ralf Corsepius (corsepiu@faw.uni-ulm.de) and |
---|
11 | * Bernd Becker (becker@faw.uni-ulm.de) |
---|
12 | * |
---|
13 | * COPYRIGHT (c) 1997-1998, FAW Ulm, Germany |
---|
14 | * |
---|
15 | * This program is distributed in the hope that it will be useful, |
---|
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE |
---|
18 | * |
---|
19 | * |
---|
20 | * COPYRIGHT (c) 1998. |
---|
21 | * On-Line Applications Research Corporation (OAR). |
---|
22 | * Copyright assigned to U.S. Government, 1994. |
---|
23 | * |
---|
24 | * The license and distribution terms for this file may be |
---|
25 | * found in the file LICENSE in this distribution or at |
---|
26 | * http://www.OARcorp.com/rtems/license.html. |
---|
27 | * |
---|
28 | * $Id$ |
---|
29 | */ |
---|
30 | |
---|
31 | #include <rtems/system.h> |
---|
32 | #include <rtems/score/shtypes.h> |
---|
33 | #include <rtems/score/ispsh7032.h> |
---|
34 | |
---|
35 | /* |
---|
36 | * This is an exception vector table |
---|
37 | * |
---|
38 | * It has the same structure like the actual vector table (vectab) |
---|
39 | */ |
---|
40 | proc_ptr _Hardware_isr_Table[256]={ |
---|
41 | _dummy_isp, _dummy_isp, _dummy_isp, _dummy_isp, |
---|
42 | _dummy_isp, _dummy_isp, _dummy_isp, _dummy_isp, |
---|
43 | _dummy_isp, _dummy_isp, _dummy_isp, |
---|
44 | _nmi_isp, _usb_isp, |
---|
45 | _dummy_isp, _dummy_isp, _dummy_isp, _dummy_isp, |
---|
46 | _dummy_isp, _dummy_isp, _dummy_isp, _dummy_isp, |
---|
47 | _dummy_isp, _dummy_isp, _dummy_isp, _dummy_isp, |
---|
48 | _dummy_isp, _dummy_isp, _dummy_isp, _dummy_isp, |
---|
49 | _dummy_isp, _dummy_isp, _dummy_isp, |
---|
50 | /* trapa 0 -31 */ |
---|
51 | _dummy_isp, _dummy_isp, _dummy_isp, _dummy_isp, |
---|
52 | _dummy_isp, _dummy_isp, _dummy_isp, _dummy_isp, |
---|
53 | _dummy_isp, _dummy_isp, _dummy_isp, _dummy_isp, |
---|
54 | _dummy_isp, _dummy_isp, _dummy_isp, _dummy_isp, |
---|
55 | _dummy_isp, _dummy_isp, _dummy_isp, _dummy_isp, |
---|
56 | _dummy_isp, _dummy_isp, _dummy_isp, _dummy_isp, |
---|
57 | _dummy_isp, _dummy_isp, _dummy_isp, _dummy_isp, |
---|
58 | _dummy_isp, _dummy_isp, _dummy_isp, _dummy_isp, |
---|
59 | /* irq 64 ... */ |
---|
60 | _irq0_isp, _irq1_isp, _irq2_isp, _irq3_isp, |
---|
61 | _irq4_isp, _irq5_isp, _irq6_isp, _irq7_isp, |
---|
62 | _dma0_isp, _dummy_isp, _dma1_isp, _dummy_isp, |
---|
63 | _dma2_isp, _dummy_isp, _dma3_isp, _dummy_isp, |
---|
64 | _imia0_isp, _imib0_isp, _ovi0_isp, _dummy_isp, |
---|
65 | _imia1_isp, _imib1_isp, _ovi1_isp, _dummy_isp, |
---|
66 | _imia2_isp, _imib2_isp, _ovi2_isp, _dummy_isp, |
---|
67 | _imia3_isp, _imib3_isp, _ovi3_isp, _dummy_isp, |
---|
68 | _imia4_isp, _imib4_isp, _ovi4_isp, _dummy_isp, |
---|
69 | _eri0_isp, _rxi0_isp, _txi0_isp, _tei0_isp, |
---|
70 | _eri1_isp, _rxi1_isp, _txi1_isp, _tei1_isp, |
---|
71 | _prt_isp, _adu_isp, _dummy_isp, _dummy_isp, |
---|
72 | _wdt_isp, |
---|
73 | /* 113 */ _dref_isp |
---|
74 | }; |
---|
75 | |
---|
76 | #define Str(a)#a |
---|
77 | |
---|
78 | /* |
---|
79 | * Some versions of gcc and all version of egcs at least until egcs-1.1b |
---|
80 | * are not able to handle #pragma interrupt correctly if more than 1 isr is |
---|
81 | * contained in a file and when optimizing. |
---|
82 | * We try to work around this problem by using the macro below. |
---|
83 | */ |
---|
84 | #define isp( name, number, func)\ |
---|
85 | asm (".global _"Str(name)"\n\t" \ |
---|
86 | "_"Str(name)": \n\t" \ |
---|
87 | " mov.l r0,@-r15 \n\t" \ |
---|
88 | " mov.l r1,@-r15 \n\t" \ |
---|
89 | " mov.l r2,@-r15 \n\t" \ |
---|
90 | " mov.l r3,@-r15 \n\t" \ |
---|
91 | " mov.l r4,@-r15 \n\t" \ |
---|
92 | " mov.l r5,@-r15 \n\t" \ |
---|
93 | " mov.l r6,@-r15 \n\t" \ |
---|
94 | " mov.l r7,@-r15 \n\t" \ |
---|
95 | " mov.l r14,@-r15 \n\t" \ |
---|
96 | " sts.l pr,@-r15 \n\t" \ |
---|
97 | " sts.l mach,@-r15 \n\t" \ |
---|
98 | " sts.l macl,@-r15 \n\t" \ |
---|
99 | " mov r15,r14 \n\t" \ |
---|
100 | " mov.l "Str(name)"_k, r1\n\t" \ |
---|
101 | " jsr @r1 \n\t" \ |
---|
102 | " mov #"Str(number)", r4\n\t" \ |
---|
103 | " mov r14,r15 \n\t" \ |
---|
104 | " lds.l @r15+,macl \n\t" \ |
---|
105 | " lds.l @r15+,mach \n\t" \ |
---|
106 | " lds.l @r15+,pr \n\t" \ |
---|
107 | " mov.l @r15+,r14 \n\t" \ |
---|
108 | " mov.l @r15+,r7 \n\t" \ |
---|
109 | " mov.l @r15+,r6 \n\t" \ |
---|
110 | " mov.l @r15+,r5 \n\t" \ |
---|
111 | " mov.l @r15+,r4 \n\t" \ |
---|
112 | " mov.l @r15+,r3 \n\t" \ |
---|
113 | " mov.l @r15+,r2 \n\t" \ |
---|
114 | " mov.l @r15+,r1 \n\t" \ |
---|
115 | " mov.l @r15+,r0 \n\t" \ |
---|
116 | " rte \n\t" \ |
---|
117 | " nop \n\t" \ |
---|
118 | " .align 2 \n\t" \ |
---|
119 | #name"_k: \n\t" \ |
---|
120 | ".long "Str(func)); |
---|
121 | |
---|
122 | /************************************************ |
---|
123 | * Dummy interrupt service procedure for |
---|
124 | * interrupts being not allowed --> Trap 34 |
---|
125 | ************************************************/ |
---|
126 | asm(" .section .text |
---|
127 | .global __dummy_isp |
---|
128 | __dummy_isp: |
---|
129 | mov.l r14,@-r15 |
---|
130 | mov r15, r14 |
---|
131 | trapa #34 |
---|
132 | mov.l @r15+,r14 |
---|
133 | rte |
---|
134 | nop"); |
---|
135 | |
---|
136 | /***************************** |
---|
137 | * Non maskable interrupt |
---|
138 | *****************************/ |
---|
139 | isp( _nmi_isp, NMI_ISP_V, ___ISR_Handler); |
---|
140 | |
---|
141 | /***************************** |
---|
142 | * User break controller |
---|
143 | *****************************/ |
---|
144 | isp( _usb_isp, USB_ISP_V, ___ISR_Handler); |
---|
145 | |
---|
146 | /***************************** |
---|
147 | * External interrupts 0-7 |
---|
148 | *****************************/ |
---|
149 | isp( _irq0_isp, IRQ0_ISP_V, ___ISR_Handler); |
---|
150 | isp( _irq1_isp, IRQ1_ISP_V, ___ISR_Handler); |
---|
151 | isp( _irq2_isp, IRQ2_ISP_V, ___ISR_Handler); |
---|
152 | isp( _irq3_isp, IRQ3_ISP_V, ___ISR_Handler); |
---|
153 | isp( _irq4_isp, IRQ4_ISP_V, ___ISR_Handler); |
---|
154 | isp( _irq5_isp, IRQ5_ISP_V, ___ISR_Handler); |
---|
155 | isp( _irq6_isp, IRQ6_ISP_V, ___ISR_Handler); |
---|
156 | isp( _irq7_isp, IRQ7_ISP_V, ___ISR_Handler); |
---|
157 | |
---|
158 | /***************************** |
---|
159 | * DMA - controller |
---|
160 | *****************************/ |
---|
161 | isp( _dma0_isp, DMA0_ISP_V, ___ISR_Handler); |
---|
162 | isp( _dma1_isp, DMA1_ISP_V, ___ISR_Handler); |
---|
163 | isp( _dma2_isp, DMA2_ISP_V, ___ISR_Handler); |
---|
164 | isp( _dma3_isp, DMA3_ISP_V, ___ISR_Handler); |
---|
165 | |
---|
166 | |
---|
167 | /***************************** |
---|
168 | * Interrupt timer unit |
---|
169 | *****************************/ |
---|
170 | |
---|
171 | /***************************** |
---|
172 | * Timer 0 |
---|
173 | *****************************/ |
---|
174 | isp( _imia0_isp, IMIA0_ISP_V, ___ISR_Handler); |
---|
175 | isp( _imib0_isp, IMIB0_ISP_V, ___ISR_Handler); |
---|
176 | isp( _ovi0_isp, OVI0_ISP_V, ___ISR_Handler); |
---|
177 | |
---|
178 | /***************************** |
---|
179 | * Timer 1 |
---|
180 | *****************************/ |
---|
181 | isp( _imia1_isp, IMIA1_ISP_V, ___ISR_Handler); |
---|
182 | isp( _imib1_isp, IMIB1_ISP_V, ___ISR_Handler); |
---|
183 | isp( _ovi1_isp, OVI1_ISP_V, ___ISR_Handler); |
---|
184 | |
---|
185 | /***************************** |
---|
186 | * Timer 2 |
---|
187 | *****************************/ |
---|
188 | isp( _imia2_isp, IMIA2_ISP_V, ___ISR_Handler); |
---|
189 | isp( _imib2_isp, IMIB2_ISP_V, ___ISR_Handler); |
---|
190 | isp( _ovi2_isp, OVI2_ISP_V, ___ISR_Handler); |
---|
191 | |
---|
192 | /***************************** |
---|
193 | * Timer 3 |
---|
194 | *****************************/ |
---|
195 | isp( _imia3_isp, IMIA3_ISP_V, ___ISR_Handler); |
---|
196 | isp( _imib3_isp, IMIB3_ISP_V, ___ISR_Handler); |
---|
197 | isp( _ovi3_isp, OVI3_ISP_V, ___ISR_Handler); |
---|
198 | |
---|
199 | /***************************** |
---|
200 | * Timer 4 |
---|
201 | *****************************/ |
---|
202 | isp( _imia4_isp, IMIA4_ISP_V, ___ISR_Handler); |
---|
203 | isp( _imib4_isp, IMIB4_ISP_V, ___ISR_Handler); |
---|
204 | isp( _ovi4_isp, OVI4_ISP_V, ___ISR_Handler); |
---|
205 | |
---|
206 | |
---|
207 | /***************************** |
---|
208 | * Serial interfaces |
---|
209 | *****************************/ |
---|
210 | |
---|
211 | /***************************** |
---|
212 | * Serial interface 0 |
---|
213 | *****************************/ |
---|
214 | isp( _eri0_isp, ERI0_ISP_V, ___ISR_Handler); |
---|
215 | isp( _rxi0_isp, RXI0_ISP_V, ___ISR_Handler); |
---|
216 | isp( _txi0_isp, TXI0_ISP_V, ___ISR_Handler); |
---|
217 | isp( _tei0_isp, TEI0_ISP_V, ___ISR_Handler); |
---|
218 | |
---|
219 | /***************************** |
---|
220 | * Serial interface 1 |
---|
221 | *****************************/ |
---|
222 | isp( _eri1_isp, ERI1_ISP_V, ___ISR_Handler); |
---|
223 | isp( _rxi1_isp, RXI1_ISP_V, ___ISR_Handler); |
---|
224 | isp( _txi1_isp, TXI1_ISP_V, ___ISR_Handler); |
---|
225 | isp( _tei1_isp, TEI1_ISP_V, ___ISR_Handler); |
---|
226 | |
---|
227 | |
---|
228 | /***************************** |
---|
229 | * Parity control unit of |
---|
230 | * the bus state controller |
---|
231 | *****************************/ |
---|
232 | isp( _prt_isp, PRT_ISP_V, ___ISR_Handler); |
---|
233 | |
---|
234 | |
---|
235 | /****************************** |
---|
236 | * Analog digital converter |
---|
237 | * ADC |
---|
238 | ******************************/ |
---|
239 | isp( _adu_isp, ADU_ISP_V, ___ISR_Handler); |
---|
240 | |
---|
241 | |
---|
242 | /****************************** |
---|
243 | * Watchdog timer |
---|
244 | ******************************/ |
---|
245 | isp( _wdt_isp, WDT_ISP_V, ___ISR_Handler); |
---|
246 | |
---|
247 | |
---|
248 | /****************************** |
---|
249 | * DRAM refresh control unit |
---|
250 | * of bus state controller |
---|
251 | ******************************/ |
---|
252 | isp( _dref_isp, DREF_ISP_V, ___ISR_Handler); |
---|