| /* | |
| * arch/v850/kernel/intv.S -- Interrupt vectors | |
| * | |
| * Copyright (C) 2001,02,03 NEC Electronics Corporation | |
| * Copyright (C) 2001,02,03 Miles Bader <miles@gnu.org> | |
| * | |
| * This file is subject to the terms and conditions of the GNU General | |
| * Public License. See the file COPYING in the main directory of this | |
| * archive for more details. | |
| * | |
| * Written by Miles Bader <miles@gnu.org> | |
| */ | |
| #include <asm/clinkage.h> | |
| #include <asm/irq.h> | |
| #include <asm/machdep.h> | |
| #include <asm/entry.h> | |
| #ifdef CONFIG_V850E_HIGHRES_TIMER | |
| #include <asm/highres_timer.h> | |
| #endif | |
| /* Jump to an interrupt/trap handler. These handlers (defined in entry.S) | |
| expect the stack-pointer to be saved in ENTRY_SP, so we use sp to do an | |
| indirect jump (which avoids problems when the handler is more than a signed | |
| 22-bit offset away). */ | |
| #define JUMP_TO_HANDLER(name, sp_save_loc) \ | |
| st.w sp, sp_save_loc; \ | |
| mov hilo(name), sp; \ | |
| jmp [sp] | |
| /* Reset vector. */ | |
| .section .intv.reset, "ax" | |
| .org 0x0 | |
| mov hilo(C_SYMBOL_NAME(start)), r1; | |
| jmp [r1] | |
| /* Generic interrupt vectors. */ | |
| .section .intv.common, "ax" | |
| .balign 0x10 | |
| JUMP_TO_HANDLER (nmi, NMI_ENTRY_SP) // 0x10 - NMI0 | |
| .balign 0x10 | |
| JUMP_TO_HANDLER (nmi, NMI_ENTRY_SP) // 0x20 - NMI1 | |
| .balign 0x10 | |
| JUMP_TO_HANDLER (nmi, NMI_ENTRY_SP) // 0x30 - NMI2 | |
| .balign 0x10 | |
| JUMP_TO_HANDLER (trap, ENTRY_SP) // 0x40 - TRAP0n | |
| .balign 0x10 | |
| JUMP_TO_HANDLER (trap, ENTRY_SP) // 0x50 - TRAP1n | |
| .balign 0x10 | |
| JUMP_TO_HANDLER (dbtrap, ENTRY_SP) // 0x60 - Illegal op / DBTRAP insn | |
| /* Hardware interrupt vectors. */ | |
| .section .intv.mach, "ax" | |
| .org 0x0 | |
| #if defined (CONFIG_V850E_HIGHRES_TIMER) && defined (IRQ_INTCMD) | |
| /* Interrupts before the highres timer interrupt. */ | |
| .rept IRQ_INTCMD (HIGHRES_TIMER_TIMER_D_UNIT) | |
| .balign 0x10 | |
| JUMP_TO_HANDLER (irq, ENTRY_SP) | |
| .endr | |
| /* The highres timer interrupt. */ | |
| .balign 0x10 | |
| JUMP_TO_HANDLER (C_SYMBOL_NAME (highres_timer_slow_tick_irq), ENTRY_SP) | |
| /* Interrupts after the highres timer interrupt. */ | |
| .rept NUM_CPU_IRQS - IRQ_INTCMD (HIGHRES_TIMER_TIMER_D_UNIT) - 1 | |
| .balign 0x10 | |
| JUMP_TO_HANDLER (irq, ENTRY_SP) | |
| .endr | |
| #else /* No highres timer */ | |
| .rept NUM_CPU_IRQS | |
| .balign 0x10 | |
| JUMP_TO_HANDLER (irq, ENTRY_SP) | |
| .endr | |
| #endif /* Highres timer */ |