| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
 | 2 |  * arch/v850/kernel/intv.S -- Interrupt vectors | 
 | 3 |  * | 
 | 4 |  *  Copyright (C) 2001,02,03  NEC Electronics Corporation | 
 | 5 |  *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org> | 
 | 6 |  * | 
 | 7 |  * This file is subject to the terms and conditions of the GNU General | 
 | 8 |  * Public License.  See the file COPYING in the main directory of this | 
 | 9 |  * archive for more details. | 
 | 10 |  * | 
 | 11 |  * Written by Miles Bader <miles@gnu.org> | 
 | 12 |  */ | 
 | 13 |  | 
 | 14 | #include <asm/clinkage.h> | 
 | 15 | #include <asm/irq.h> | 
 | 16 | #include <asm/machdep.h> | 
 | 17 | #include <asm/entry.h> | 
 | 18 |  | 
 | 19 | #ifdef CONFIG_V850E_HIGHRES_TIMER | 
 | 20 | #include <asm/highres_timer.h> | 
 | 21 | #endif | 
 | 22 |  | 
 | 23 | /* Jump to an interrupt/trap handler.  These handlers (defined in entry.S) | 
 | 24 |    expect the stack-pointer to be saved in ENTRY_SP, so we use sp to do an | 
 | 25 |    indirect jump (which avoids problems when the handler is more than a signed | 
 | 26 |    22-bit offset away).  */ | 
 | 27 | #define JUMP_TO_HANDLER(name, sp_save_loc)				      \ | 
 | 28 | 	st.w	sp, sp_save_loc;					      \ | 
 | 29 | 	mov	hilo(name), sp;						      \ | 
 | 30 | 	jmp	[sp] | 
 | 31 |  | 
 | 32 |  | 
 | 33 | 	/* Reset vector.  */ | 
 | 34 | 	.section	.intv.reset, "ax" | 
 | 35 | 	.org	0x0 | 
 | 36 | 	mov	hilo(C_SYMBOL_NAME(start)), r1; | 
 | 37 | 	jmp	[r1] | 
 | 38 |  | 
 | 39 |  | 
 | 40 | 	/* Generic interrupt vectors.  */ | 
 | 41 | 	.section	.intv.common, "ax" | 
 | 42 | 	.balign	0x10 | 
 | 43 | 	JUMP_TO_HANDLER (nmi, NMI_ENTRY_SP)	// 0x10 - NMI0 | 
 | 44 | 	.balign	0x10 | 
 | 45 | 	JUMP_TO_HANDLER (nmi, NMI_ENTRY_SP)	// 0x20 - NMI1 | 
 | 46 | 	.balign	0x10 | 
 | 47 | 	JUMP_TO_HANDLER (nmi, NMI_ENTRY_SP)	// 0x30 - NMI2 | 
 | 48 | 	 | 
 | 49 | 	.balign	0x10 | 
 | 50 | 	JUMP_TO_HANDLER (trap, ENTRY_SP)	// 0x40 - TRAP0n | 
 | 51 | 	.balign	0x10 | 
 | 52 | 	JUMP_TO_HANDLER (trap, ENTRY_SP)	// 0x50 - TRAP1n | 
 | 53 |  | 
 | 54 | 	.balign	0x10 | 
 | 55 | 	JUMP_TO_HANDLER (dbtrap, ENTRY_SP)	// 0x60 - Illegal op / DBTRAP insn | 
 | 56 |  | 
 | 57 |  | 
 | 58 | 	/* Hardware interrupt vectors.  */ | 
 | 59 | 	.section	.intv.mach, "ax" | 
 | 60 | 	.org	0x0 | 
 | 61 |  | 
 | 62 | #if defined (CONFIG_V850E_HIGHRES_TIMER) && defined (IRQ_INTCMD) | 
 | 63 |  | 
 | 64 | 	/* Interrupts before the highres timer interrupt.  */ | 
 | 65 | 	.rept	IRQ_INTCMD (HIGHRES_TIMER_TIMER_D_UNIT) | 
 | 66 | 	.balign	0x10 | 
 | 67 | 	JUMP_TO_HANDLER (irq, ENTRY_SP) | 
 | 68 | 	.endr | 
 | 69 |  | 
 | 70 | 	/* The highres timer interrupt.  */ | 
 | 71 | 	.balign	0x10 | 
 | 72 | 	JUMP_TO_HANDLER (C_SYMBOL_NAME (highres_timer_slow_tick_irq), ENTRY_SP) | 
 | 73 |  | 
 | 74 | 	/* Interrupts after the highres timer interrupt.  */ | 
 | 75 | 	.rept	NUM_CPU_IRQS - IRQ_INTCMD (HIGHRES_TIMER_TIMER_D_UNIT) - 1 | 
 | 76 | 	.balign	0x10 | 
 | 77 | 	JUMP_TO_HANDLER (irq, ENTRY_SP) | 
 | 78 | 	.endr | 
 | 79 |  | 
 | 80 | #else /* No highres timer */ | 
 | 81 |  | 
 | 82 | 	.rept	NUM_CPU_IRQS | 
 | 83 | 	.balign	0x10 | 
 | 84 | 	JUMP_TO_HANDLER (irq, ENTRY_SP) | 
 | 85 | 	.endr | 
 | 86 |  | 
 | 87 | #endif /* Highres timer */ |