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

4.104.115
Last change on this file since b513fa6 was b513fa6, checked in by Joel Sherrill <joel.sherrill@…>, on 05/05/09 at 14:22:43

2009-05-05 Michael Walle <michael@…>

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