]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - embedded/arch/arm/mach-lpc21xx/libs/hal/ivt.S
Update of system-less architecture and board support code to actual uLAN.sf.net version.
[lincan.git] / embedded / arch / arm / mach-lpc21xx / libs / hal / ivt.S
index ae9032aabe9dfad7c2ab68f07ec33243a1818c97..84ded7115c05c2f4176b0901c54cfca8e281aefa 100644 (file)
@@ -1,6 +1,12 @@
 /* Setup vector table.  Note that undf, pabt, dabt, fiq just execute
 a null loop. */
 
+#include <bbconf_info.h>
+
+.global __bbconf_magic_addr
+.global __bbconf_ptptr_addr
+.global __bbconf_pt_addr
+
 .section .ivt,"ax"
          .code 32
          .align 0
@@ -13,7 +19,11 @@ hal_vectors:    LDR     PC, Reset_Addr
                 LDR     PC, PAbt_Addr
                 LDR     PC, DAbt_Addr
                 NOP                            /* Reserved Vector */
+#if !defined(__thumb__)
                 LDR     PC, IRQ_Addr
+#else
+                B       IRQ_Trampoline
+#endif
                 LDR     PC, FIQ_Addr
 
 Reset_Addr:     .word   reset_handler
@@ -25,10 +35,33 @@ DAbt_Addr:      .word   DAbt_Handler
 IRQ_Addr:       .word   irq_handler_resolver
 FIQ_Addr:       .word   FIQ_Handler
 
+__bbconf_magic_addr:
+       .word   BBCONF_MAGIC_VAL
+__bbconf_ptptr_addr:
+       .word   __bbconf_pt_addr
+
 Undef_Handler:  B       Undef_Handler
 SWI_Handler:    B       SWI_Handler
 PAbt_Handler:   B       PAbt_Handler
 DAbt_Handler:   B       DAbt_Handler
 FIQ_Handler:    B       FIQ_Handler
 
+#if defined(__thumb__)
+IRQ_Trampoline:
+               sub     lr, lr, #4
+               push    {r0, r1, r2, r3, r4, ip, lr}
+                ldr    r1, IRQ_Addr
+               adr     lr, IRQ_Trampoline_ret
+               tst     r1,#1
+               adrne   lr, IRQ_Trampoline_ret_thumb+1
+               bx      r1
+IRQ_Trampoline_ret_thumb:
+         .code 16
+               bx      pc
+               nop
+         .code 32
+IRQ_Trampoline_ret:
+               ldm     sp!, {r0, r1, r2, r3, r4, ip, pc}^
+#endif
+
         .end