88 строки
2.2 KiB
ArmAsm
88 строки
2.2 KiB
ArmAsm
|
/*
|
||
|
* 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 */
|