1 | /* |
---|
2 | * lm32 debug exception vectors |
---|
3 | * |
---|
4 | * Michael Walle <michael@walle.cc>, 2009 |
---|
5 | * |
---|
6 | * If debugging is enabled the debug exception base address (deba) gets |
---|
7 | * remapped to this file. |
---|
8 | * |
---|
9 | * The license and distribution terms for this file may be |
---|
10 | * found in the file LICENSE in this distribution or at |
---|
11 | * http://www.rtems.org/license/LICENSE. |
---|
12 | * |
---|
13 | */ |
---|
14 | |
---|
15 | #include "bspopts.h" |
---|
16 | |
---|
17 | .section .text |
---|
18 | /* (D)EBA alignment */ |
---|
19 | .align 256 |
---|
20 | .globl _deba |
---|
21 | |
---|
22 | _deba: |
---|
23 | debug_reset_handler: |
---|
24 | /* Clear r0 */ |
---|
25 | xor r0,r0,r0 |
---|
26 | /* Disable interrupts */ |
---|
27 | wcsr IE, r0 |
---|
28 | /* Mask all interrupts */ |
---|
29 | wcsr IM,r0 |
---|
30 | /* Jump to original crt0 */ |
---|
31 | .extern crt0 |
---|
32 | mvhi r1, hi(crt0) |
---|
33 | ori r1, r1, lo(crt0) |
---|
34 | b r1 |
---|
35 | nop |
---|
36 | nop |
---|
37 | debug_breakpoint_handler: |
---|
38 | /* Clear r0 in case it was corrupted */ |
---|
39 | xor r0, r0, r0 |
---|
40 | mvhi r0, hi(registers) |
---|
41 | ori r0, r0, lo(registers) |
---|
42 | sw (r0+116), ra |
---|
43 | sw (r0+128), ba |
---|
44 | calli save_all |
---|
45 | calli handle_exception |
---|
46 | calli b_restore_and_return |
---|
47 | debug_instruction_bus_error_handler: |
---|
48 | /* Clear r0 in case it was corrupted */ |
---|
49 | xor r0, r0, r0 |
---|
50 | mvhi r0, hi(registers) |
---|
51 | ori r0, r0, lo(registers) |
---|
52 | sw (r0+116), ra |
---|
53 | sw (r0+128), ea |
---|
54 | calli save_all |
---|
55 | calli handle_exception |
---|
56 | calli e_restore_and_return |
---|
57 | debug_watchpoint_handler: |
---|
58 | /* Clear r0 in case it was corrupted */ |
---|
59 | xor r0, r0, r0 |
---|
60 | mvhi r0, hi(registers) |
---|
61 | ori r0, r0, lo(registers) |
---|
62 | sw (r0+116), ra |
---|
63 | sw (r0+128), ba |
---|
64 | calli save_all |
---|
65 | calli handle_exception |
---|
66 | calli b_restore_and_return |
---|
67 | debug_data_bus_error_handler: |
---|
68 | /* Clear r0 in case it was corrupted */ |
---|
69 | xor r0, r0, r0 |
---|
70 | mvhi r0, hi(registers) |
---|
71 | ori r0, r0, lo(registers) |
---|
72 | sw (r0+116), ra |
---|
73 | sw (r0+128), ea |
---|
74 | calli save_all |
---|
75 | calli handle_exception |
---|
76 | calli e_restore_and_return |
---|
77 | debug_divide_by_zero_handler: |
---|
78 | /* Clear r0 in case it was corrupted */ |
---|
79 | xor r0, r0, r0 |
---|
80 | mvhi r0, hi(registers) |
---|
81 | ori r0, r0, lo(registers) |
---|
82 | sw (r0+116), ra |
---|
83 | sw (r0+128), ea |
---|
84 | calli save_all |
---|
85 | calli handle_exception |
---|
86 | calli e_restore_and_return |
---|
87 | debug_interrupt_handler: |
---|
88 | bi debug_isr_handler |
---|
89 | nop |
---|
90 | nop |
---|
91 | nop |
---|
92 | nop |
---|
93 | nop |
---|
94 | nop |
---|
95 | nop |
---|
96 | debug_system_call_handler: |
---|
97 | /* Clear r0 in case it was corrupted */ |
---|
98 | xor r0, r0, r0 |
---|
99 | mvhi r0, hi(registers) |
---|
100 | ori r0, r0, lo(registers) |
---|
101 | sw (r0+116), ra |
---|
102 | sw (r0+128), ea |
---|
103 | calli save_all |
---|
104 | calli handle_exception |
---|
105 | calli e_restore_and_return |
---|
106 | |
---|
107 | debug_isr_handler: |
---|
108 | addi sp, sp, -156 |
---|
109 | sw (sp+4), r1 |
---|
110 | sw (sp+8), r2 |
---|
111 | sw (sp+12), r3 |
---|
112 | sw (sp+16), r4 |
---|
113 | sw (sp+20), r5 |
---|
114 | sw (sp+24), r6 |
---|
115 | sw (sp+28), r7 |
---|
116 | sw (sp+32), r8 |
---|
117 | sw (sp+36), r9 |
---|
118 | sw (sp+40), r10 |
---|
119 | sw (sp+44), ra |
---|
120 | sw (sp+48), ea |
---|
121 | sw (sp+52), ba |
---|
122 | sw (sp+56), r11 |
---|
123 | sw (sp+60), r12 |
---|
124 | sw (sp+64), r13 |
---|
125 | sw (sp+68), r14 |
---|
126 | sw (sp+72), r15 |
---|
127 | sw (sp+76), r16 |
---|
128 | sw (sp+80), r17 |
---|
129 | sw (sp+84), r18 |
---|
130 | sw (sp+88), r19 |
---|
131 | sw (sp+92), r20 |
---|
132 | sw (sp+96), r21 |
---|
133 | sw (sp+100), r22 |
---|
134 | sw (sp+104), r23 |
---|
135 | sw (sp+108), r24 |
---|
136 | sw (sp+112), r25 |
---|
137 | sw (sp+116), r26 |
---|
138 | sw (sp+120), r27 |
---|
139 | /* 124 - SP */ |
---|
140 | addi r1, sp, 156 |
---|
141 | sw (sp+124), r1 |
---|
142 | /* 128 - PC */ |
---|
143 | sw (sp+128), ea |
---|
144 | /* 132 - EID */ |
---|
145 | mvi r1, 6 |
---|
146 | sw (sp+132), r1 |
---|
147 | rcsr r1, EBA |
---|
148 | sw (sp+136), r1 |
---|
149 | rcsr r1, DEBA |
---|
150 | sw (sp+140), r1 |
---|
151 | rcsr r1, IE |
---|
152 | sw (sp+144), r1 |
---|
153 | |
---|
154 | /* This is the same code as in cpu_asm.S */ |
---|
155 | rcsr r2, IP |
---|
156 | rcsr r3, IM |
---|
157 | mv r1, r0 |
---|
158 | and r2, r2, r3 |
---|
159 | mvi r3, 1 |
---|
160 | be r2, r0, 3f |
---|
161 | 1: |
---|
162 | and r4, r2, r3 |
---|
163 | bne r4, r0, 2f |
---|
164 | sli r3, r3, 1 |
---|
165 | addi r1, r1, 1 |
---|
166 | bi 1b |
---|
167 | 2: |
---|
168 | addi r2, sp, 4 |
---|
169 | |
---|
170 | .extern __ISR_Handler |
---|
171 | mvhi r3, hi(__ISR_Handler) |
---|
172 | ori r3, r3, lo(__ISR_Handler) |
---|
173 | call r3 |
---|
174 | 3: |
---|
175 | lw r1, (sp+4) |
---|
176 | lw r2, (sp+8) |
---|
177 | lw r3, (sp+12) |
---|
178 | lw r4, (sp+16) |
---|
179 | lw r5, (sp+20) |
---|
180 | lw r6, (sp+24) |
---|
181 | lw r7, (sp+28) |
---|
182 | lw r8, (sp+32) |
---|
183 | lw r9, (sp+36) |
---|
184 | lw r10, (sp+40) |
---|
185 | lw ra, (sp+44) |
---|
186 | lw ea, (sp+48) |
---|
187 | lw ba, (sp+52) |
---|
188 | lw r11, (sp+56) |
---|
189 | lw r12, (sp+60) |
---|
190 | lw r13, (sp+64) |
---|
191 | lw r14, (sp+68) |
---|
192 | lw r15, (sp+72) |
---|
193 | lw r16, (sp+76) |
---|
194 | lw r17, (sp+80) |
---|
195 | lw r18, (sp+84) |
---|
196 | lw r19, (sp+88) |
---|
197 | lw r20, (sp+92) |
---|
198 | lw r21, (sp+96) |
---|
199 | lw r22, (sp+100) |
---|
200 | lw r23, (sp+104) |
---|
201 | lw r24, (sp+108) |
---|
202 | lw r25, (sp+112) |
---|
203 | lw r26, (sp+116) |
---|
204 | lw r27, (sp+120) |
---|
205 | lw ea, (sp+136) |
---|
206 | wcsr EBA, ea |
---|
207 | lw ea, (sp+140) |
---|
208 | wcsr DEBA, ea |
---|
209 | /* Restore EA from PC */ |
---|
210 | lw ea, (sp+128) |
---|
211 | /* Stack pointer must be restored last, in case it has been updated */ |
---|
212 | lw sp, (sp+124) |
---|
213 | eret |
---|
214 | |
---|
215 | save_all: |
---|
216 | sw (r0+4), r1 |
---|
217 | sw (r0+8), r2 |
---|
218 | sw (r0+12), r3 |
---|
219 | sw (r0+16), r4 |
---|
220 | sw (r0+20), r5 |
---|
221 | sw (r0+24), r6 |
---|
222 | sw (r0+28), r7 |
---|
223 | sw (r0+32), r8 |
---|
224 | sw (r0+36), r9 |
---|
225 | sw (r0+40), r10 |
---|
226 | sw (r0+44), r11 |
---|
227 | sw (r0+48), r12 |
---|
228 | sw (r0+52), r13 |
---|
229 | sw (r0+56), r14 |
---|
230 | sw (r0+60), r15 |
---|
231 | sw (r0+64), r16 |
---|
232 | sw (r0+68), r17 |
---|
233 | sw (r0+72), r18 |
---|
234 | sw (r0+76), r19 |
---|
235 | sw (r0+80), r20 |
---|
236 | sw (r0+84), r21 |
---|
237 | sw (r0+88), r22 |
---|
238 | sw (r0+92), r23 |
---|
239 | sw (r0+96), r24 |
---|
240 | sw (r0+100), r25 |
---|
241 | sw (r0+104), r26 |
---|
242 | sw (r0+108), r27 |
---|
243 | sw (r0+112), sp |
---|
244 | /* 116 - RA - saved in handler code above */ |
---|
245 | sw (r0+120), ea |
---|
246 | sw (r0+124), ba |
---|
247 | /* 128 - PC - saved in handler code above */ |
---|
248 | /* 132 - EID - saved below */ |
---|
249 | rcsr r1, EBA |
---|
250 | sw (r0+136), r1 |
---|
251 | rcsr r1, DEBA |
---|
252 | sw (r0+140), r1 |
---|
253 | rcsr r1, IE |
---|
254 | sw (r0+144), r1 |
---|
255 | |
---|
256 | /* Work out EID from exception entry point address */ |
---|
257 | andi r1, ra, 0xff |
---|
258 | srui r1, r1, 5 |
---|
259 | sw (r0+132), r1 |
---|
260 | |
---|
261 | /* Save pointer to registers */ |
---|
262 | mv r1, r0 |
---|
263 | |
---|
264 | /* Restore r0 to 0 */ |
---|
265 | xor r0, r0, r0 |
---|
266 | |
---|
267 | /* Save r0 (hardcoded to 0) */ |
---|
268 | sw (r1+0), r0 |
---|
269 | ret |
---|
270 | |
---|
271 | |
---|
272 | /* Restore gp registers */ |
---|
273 | restore_gp: |
---|
274 | lw r1, (r0+4) |
---|
275 | lw r2, (r0+8) |
---|
276 | lw r3, (r0+12) |
---|
277 | lw r4, (r0+16) |
---|
278 | lw r5, (r0+20) |
---|
279 | lw r6, (r0+24) |
---|
280 | lw r7, (r0+28) |
---|
281 | lw r8, (r0+32) |
---|
282 | lw r9, (r0+36) |
---|
283 | lw r10, (r0+40) |
---|
284 | lw r11, (r0+44) |
---|
285 | lw r12, (r0+48) |
---|
286 | lw r13, (r0+52) |
---|
287 | lw r14, (r0+56) |
---|
288 | lw r15, (r0+60) |
---|
289 | lw r16, (r0+64) |
---|
290 | lw r17, (r0+68) |
---|
291 | lw r18, (r0+72) |
---|
292 | lw r19, (r0+76) |
---|
293 | lw r20, (r0+80) |
---|
294 | lw r21, (r0+84) |
---|
295 | lw r22, (r0+88) |
---|
296 | lw r23, (r0+92) |
---|
297 | lw r24, (r0+96) |
---|
298 | lw r25, (r0+100) |
---|
299 | lw r26, (r0+104) |
---|
300 | lw r27, (r0+108) |
---|
301 | ret |
---|
302 | |
---|
303 | /* Restore registers and return from exception */ |
---|
304 | e_restore_and_return: |
---|
305 | /* first restore gp registers */ |
---|
306 | mvhi r0, hi(registers) |
---|
307 | ori r0, r0, lo(registers) |
---|
308 | calli restore_gp |
---|
309 | lw sp, (r0+112) |
---|
310 | lw ra, (r0+116) |
---|
311 | lw ba, (r0+124) |
---|
312 | lw ea, (r0+136) |
---|
313 | wcsr EBA, ea |
---|
314 | lw ea, (r0+140) |
---|
315 | wcsr DEBA, ea |
---|
316 | /* Restore EA from PC */ |
---|
317 | lw ea, (r0+128) |
---|
318 | xor r0, r0, r0 |
---|
319 | eret |
---|
320 | |
---|
321 | /* Restore registers and return from breakpoint */ |
---|
322 | b_restore_and_return: |
---|
323 | /* first restore gp registers */ |
---|
324 | mvhi r0, hi(registers) |
---|
325 | ori r0, r0, lo(registers) |
---|
326 | calli restore_gp |
---|
327 | lw sp, (r0+112) |
---|
328 | lw ra, (r0+116) |
---|
329 | lw ea, (r0+120) |
---|
330 | lw ba, (r0+136) |
---|
331 | wcsr EBA, ba |
---|
332 | lw ba, (r0+140) |
---|
333 | wcsr DEBA, ba |
---|
334 | /* Restore BA from PC */ |
---|
335 | lw ba, (r0+128) |
---|
336 | xor r0, r0, r0 |
---|
337 | bret |
---|
338 | |
---|