Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:23:44

0001 /*
0002  *  lm32 debug exception vectors
0003  *
0004  *  Michael Walle <michael@walle.cc>, 2009
0005  *
0006  *  If debugging is enabled the debug exception base address (deba) gets
0007  *  remapped to this file.
0008  *
0009  *  The license and distribution terms for this file may be
0010  *  found in the file LICENSE in this distribution or at
0011  *  http://www.rtems.org/license/LICENSE.
0012  *
0013  */
0014 
0015 #include "bspopts.h"
0016 
0017 .section .text
0018 /* (D)EBA alignment */
0019 .align    256
0020 .globl  _deba
0021 
0022 _deba:
0023 debug_reset_handler:
0024     /* Clear r0 */
0025     xor r0,r0,r0
0026     /* Disable interrupts */
0027     wcsr    IE, r0
0028     /* Mask all interrupts */
0029     wcsr    IM,r0
0030     /* Jump to original crt0 */
0031     .extern crt0
0032     mvhi    r1, hi(crt0)
0033     ori r1, r1, lo(crt0)
0034     b   r1
0035     nop
0036     nop
0037 debug_breakpoint_handler:
0038     /* Clear r0 in case it was corrupted */
0039     xor r0, r0, r0
0040     mvhi    r0, hi(registers)
0041     ori r0, r0, lo(registers)
0042     sw  (r0+116), ra
0043     sw  (r0+128), ba
0044     calli   save_all
0045     calli   handle_exception
0046     calli   b_restore_and_return
0047 debug_instruction_bus_error_handler:
0048     /* Clear r0 in case it was corrupted */
0049     xor r0, r0, r0
0050     mvhi    r0, hi(registers)
0051     ori r0, r0, lo(registers)
0052     sw  (r0+116), ra
0053     sw  (r0+128), ea
0054     calli   save_all
0055     calli   handle_exception
0056     calli   e_restore_and_return
0057 debug_watchpoint_handler:
0058     /* Clear r0 in case it was corrupted */
0059     xor r0, r0, r0
0060     mvhi    r0, hi(registers)
0061     ori r0, r0, lo(registers)
0062     sw  (r0+116), ra
0063     sw  (r0+128), ba
0064     calli   save_all
0065     calli   handle_exception
0066     calli   b_restore_and_return
0067 debug_data_bus_error_handler:
0068     /* Clear r0 in case it was corrupted */
0069     xor r0, r0, r0
0070     mvhi    r0, hi(registers)
0071     ori r0, r0, lo(registers)
0072     sw  (r0+116), ra
0073     sw  (r0+128), ea
0074     calli   save_all
0075     calli   handle_exception
0076     calli   e_restore_and_return
0077 debug_divide_by_zero_handler:
0078     /* Clear r0 in case it was corrupted */
0079     xor r0, r0, r0
0080     mvhi    r0, hi(registers)
0081     ori r0, r0, lo(registers)
0082     sw  (r0+116), ra
0083     sw  (r0+128), ea
0084     calli   save_all
0085     calli   handle_exception
0086     calli   e_restore_and_return
0087 debug_interrupt_handler:
0088     bi  debug_isr_handler
0089     nop
0090     nop
0091     nop
0092     nop
0093     nop
0094     nop
0095     nop
0096 debug_system_call_handler:
0097     /* Clear r0 in case it was corrupted */
0098     xor r0, r0, r0
0099     mvhi    r0, hi(registers)
0100     ori r0, r0, lo(registers)
0101     sw  (r0+116), ra
0102     sw  (r0+128), ea
0103     calli   save_all
0104     calli   handle_exception
0105     calli   e_restore_and_return
0106 
0107 debug_isr_handler:
0108     addi    sp, sp, -156
0109     sw  (sp+4), r1
0110     sw  (sp+8), r2
0111     sw  (sp+12), r3
0112     sw  (sp+16), r4
0113     sw  (sp+20), r5
0114     sw  (sp+24), r6
0115     sw  (sp+28), r7
0116     sw  (sp+32), r8
0117     sw  (sp+36), r9
0118     sw  (sp+40), r10
0119     sw  (sp+44), ra
0120     sw  (sp+48), ea
0121     sw  (sp+52), ba
0122     sw  (sp+56), r11
0123     sw  (sp+60), r12
0124     sw  (sp+64), r13
0125     sw  (sp+68), r14
0126     sw  (sp+72), r15
0127     sw  (sp+76), r16
0128     sw  (sp+80), r17
0129     sw  (sp+84), r18
0130     sw  (sp+88), r19
0131     sw  (sp+92), r20
0132     sw  (sp+96), r21
0133     sw  (sp+100), r22
0134     sw  (sp+104), r23
0135     sw  (sp+108), r24
0136     sw  (sp+112), r25
0137     sw  (sp+116), r26
0138     sw  (sp+120), r27
0139     /* 124 - SP */
0140     addi    r1, sp, 156
0141     sw  (sp+124), r1
0142     /* 128 - PC */
0143     sw  (sp+128), ea
0144     /* 132 - EID */
0145     mvi r1, 6
0146     sw  (sp+132), r1
0147     rcsr    r1, EBA
0148     sw  (sp+136), r1
0149     rcsr    r1, DEBA
0150     sw  (sp+140), r1
0151     rcsr    r1, IE
0152     sw  (sp+144), r1
0153 
0154     /* This is the same code as in cpu_asm.S */
0155     rcsr    r2, IP
0156     rcsr    r3, IM
0157     mv  r1, r0
0158     and r2, r2, r3
0159     mvi r3, 1
0160     be  r2, r0, 3f
0161 1:
0162     and r4, r2, r3
0163     bne r4, r0, 2f
0164     sli r3, r3, 1
0165     addi    r1, r1, 1
0166     bi  1b
0167 2:
0168     addi    r2, sp, 4
0169 
0170     .extern __ISR_Handler
0171     mvhi    r3, hi(__ISR_Handler)
0172     ori r3, r3, lo(__ISR_Handler)
0173     call    r3
0174 3:
0175     lw  r1, (sp+4)
0176     lw  r2, (sp+8)
0177     lw  r3, (sp+12)
0178     lw  r4, (sp+16)
0179     lw  r5, (sp+20)
0180     lw  r6, (sp+24)
0181     lw  r7, (sp+28)
0182     lw  r8, (sp+32)
0183     lw  r9, (sp+36)
0184     lw  r10, (sp+40)
0185     lw  ra, (sp+44)
0186     lw  ea, (sp+48)
0187     lw  ba, (sp+52)
0188     lw  r11, (sp+56)
0189     lw  r12, (sp+60)
0190     lw  r13, (sp+64)
0191     lw  r14, (sp+68)
0192     lw  r15, (sp+72)
0193     lw  r16, (sp+76)
0194     lw  r17, (sp+80)
0195     lw  r18, (sp+84)
0196     lw  r19, (sp+88)
0197     lw  r20, (sp+92)
0198     lw  r21, (sp+96)
0199     lw  r22, (sp+100)
0200     lw  r23, (sp+104)
0201     lw  r24, (sp+108)
0202     lw  r25, (sp+112)
0203     lw  r26, (sp+116)
0204     lw  r27, (sp+120)
0205     lw  ea, (sp+136)
0206     wcsr    EBA, ea
0207     lw  ea, (sp+140)
0208     wcsr    DEBA, ea
0209     /* Restore EA from PC */
0210     lw  ea, (sp+128)
0211     /* Stack pointer must be restored last, in case it has been updated */
0212     lw  sp, (sp+124)
0213     eret
0214 
0215 save_all:
0216     sw  (r0+4), r1
0217     sw  (r0+8), r2
0218     sw  (r0+12), r3
0219     sw  (r0+16), r4
0220     sw  (r0+20), r5
0221     sw  (r0+24), r6
0222     sw  (r0+28), r7
0223     sw  (r0+32), r8
0224     sw  (r0+36), r9
0225     sw  (r0+40), r10
0226     sw  (r0+44), r11
0227     sw  (r0+48), r12
0228     sw  (r0+52), r13
0229     sw  (r0+56), r14
0230     sw  (r0+60), r15
0231     sw  (r0+64), r16
0232     sw  (r0+68), r17
0233     sw  (r0+72), r18
0234     sw  (r0+76), r19
0235     sw  (r0+80), r20
0236     sw  (r0+84), r21
0237     sw  (r0+88), r22
0238     sw  (r0+92), r23
0239     sw  (r0+96), r24
0240     sw  (r0+100), r25
0241     sw  (r0+104), r26
0242     sw  (r0+108), r27
0243     sw  (r0+112), sp
0244     /* 116 - RA - saved in handler code above */
0245     sw  (r0+120), ea
0246     sw  (r0+124), ba
0247     /* 128 - PC - saved in handler code above */
0248     /* 132 - EID - saved below */
0249     rcsr    r1, EBA
0250     sw  (r0+136), r1
0251     rcsr    r1, DEBA
0252     sw  (r0+140), r1
0253     rcsr    r1, IE
0254     sw  (r0+144), r1
0255 
0256     /* Work out EID from exception entry point address */
0257     andi    r1, ra, 0xff
0258     srui    r1, r1, 5
0259     sw      (r0+132), r1
0260 
0261     /* Save pointer to registers */
0262     mv  r1, r0
0263 
0264     /* Restore r0 to 0 */
0265     xor r0, r0, r0
0266 
0267     /* Save r0 (hardcoded to 0) */
0268     sw  (r1+0), r0
0269     ret
0270 
0271 
0272 /* Restore gp registers */
0273 restore_gp:
0274     lw  r1, (r0+4)
0275     lw  r2, (r0+8)
0276     lw  r3, (r0+12)
0277     lw  r4, (r0+16)
0278     lw  r5, (r0+20)
0279     lw  r6, (r0+24)
0280     lw  r7, (r0+28)
0281     lw  r8, (r0+32)
0282     lw  r9, (r0+36)
0283     lw  r10, (r0+40)
0284     lw  r11, (r0+44)
0285     lw  r12, (r0+48)
0286     lw  r13, (r0+52)
0287     lw  r14, (r0+56)
0288     lw  r15, (r0+60)
0289     lw  r16, (r0+64)
0290     lw  r17, (r0+68)
0291     lw  r18, (r0+72)
0292     lw  r19, (r0+76)
0293     lw  r20, (r0+80)
0294     lw  r21, (r0+84)
0295     lw  r22, (r0+88)
0296     lw  r23, (r0+92)
0297     lw  r24, (r0+96)
0298     lw  r25, (r0+100)
0299     lw  r26, (r0+104)
0300     lw  r27, (r0+108)
0301     ret
0302 
0303 /* Restore registers and return from exception */
0304 e_restore_and_return:
0305     /* first restore gp registers */
0306     mvhi    r0, hi(registers)
0307     ori r0, r0, lo(registers)
0308     calli   restore_gp
0309     lw  sp, (r0+112)
0310     lw  ra, (r0+116)
0311     lw  ba, (r0+124)
0312     lw  ea, (r0+136)
0313     wcsr    EBA, ea
0314     lw  ea, (r0+140)
0315     wcsr    DEBA, ea
0316     /* Restore EA from PC */
0317     lw  ea, (r0+128)
0318     xor r0, r0, r0
0319     eret
0320 
0321 /* Restore registers and return from breakpoint */
0322 b_restore_and_return:
0323     /* first restore gp registers */
0324     mvhi    r0, hi(registers)
0325     ori r0, r0, lo(registers)
0326     calli   restore_gp
0327     lw  sp, (r0+112)
0328     lw  ra, (r0+116)
0329     lw  ea, (r0+120)
0330     lw  ba, (r0+136)
0331     wcsr    EBA, ba
0332     lw  ba, (r0+140)
0333     wcsr    DEBA, ba
0334     /* Restore BA from PC */
0335     lw  ba, (r0+128)
0336     xor r0, r0, r0
0337     bret
0338