source: rtems/c/src/lib/libbsp/lm32/shared/gdbstub/lm32-debug.S @ c499856

4.115
Last change on this file since c499856 was c499856, checked in by Chris Johns <chrisj@…>, on Mar 20, 2014 at 9:10:47 PM

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

  • Property mode set to 100644
File size: 6.0 KB
Line 
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:
23debug_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
37debug_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
47debug_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
57debug_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
67debug_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
77debug_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
87debug_interrupt_handler:
88        bi      debug_isr_handler
89        nop
90        nop
91        nop
92        nop
93        nop
94        nop
95        nop
96debug_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
107debug_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
1611:
162        and     r4, r2, r3
163        bne     r4, r0, 2f
164        sli     r3, r3, 1
165        addi    r1, r1, 1
166        bi      1b
1672:
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
1743:
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
215save_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 */
273restore_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 */
304e_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 */
322b_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
Note: See TracBrowser for help on using the repository browser.