/* Setup vector table. Note that undf, pabt, dabt, fiq just execute a null loop. */ #include .global __bbconf_magic_addr .global __bbconf_ptptr_addr .global __bbconf_pt_addr .section .ivt,"ax" .code 32 .align 0 .global hal_vectors hal_vectors: LDR PC, Reset_Addr LDR PC, Undef_Addr LDR PC, SWI_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 Undef_Addr: .word Undef_Handler SWI_Addr: .word SWI_Handler PAbt_Addr: .word PAbt_Handler DAbt_Addr: .word DAbt_Handler .word 0 /* Reserved Address */ 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