4 * Copyright (C) 1993, 1994 by Hamish Macdonald
6 * 68040 fixes by Michael Rausch
7 * 68040 fixes by Martin Apel
8 * 68040 fixes and writeback by Richard Zidlicky
9 * 68060 fixes by Roman Hodek
10 * 68060 fixes by Jesper Skov
12 * This file is subject to the terms and conditions of the GNU General Public
13 * License. See the file COPYING in the main directory of this archive
18 * Sets up all exception vectors
20 #include <linux/sched.h>
21 #include <linux/kernel.h>
22 #include <linux/linkage.h>
23 #include <linux/init.h>
24 #include <linux/kallsyms.h>
26 #include <asm/setup.h>
28 #include <asm/system.h>
29 #include <asm/traps.h>
31 /* assembler routines */
32 asmlinkage
void system_call(void);
33 asmlinkage
void buserr(void);
34 asmlinkage
void trap(void);
35 asmlinkage
void nmihandler(void);
36 #ifdef CONFIG_M68KFPU_EMU
37 asmlinkage
void fpu_emu(void);
40 e_vector vectors
[256];
42 /* nmi handler for the Amiga */
48 * this must be called very early as the kernel might
49 * use some instruction that are emulated on the 060
50 * and so we're prepared for early probe attempts (e.g. nf_init).
52 void __init
base_trap_init(void)
55 extern e_vector
*sun3x_prom_vbr
;
57 __asm__
volatile ("movec %%vbr, %0" : "=r" (sun3x_prom_vbr
));
60 /* setup the exception vector table */
61 __asm__
volatile ("movec %0,%%vbr" : : "r" ((void*)vectors
));
64 /* set up ISP entry points */
65 asmlinkage
void unimp_vec(void) asm ("_060_isp_unimp");
67 vectors
[VEC_UNIMPII
] = unimp_vec
;
70 vectors
[VEC_BUSERR
] = buserr
;
71 vectors
[VEC_ILLEGAL
] = trap
;
72 vectors
[VEC_SYS
] = system_call
;
75 void __init
trap_init (void)
79 for (i
= VEC_SPUR
; i
<= VEC_INT7
; i
++)
80 vectors
[i
] = bad_inthandler
;
82 for (i
= 0; i
< VEC_USER
; i
++)
86 for (i
= VEC_USER
; i
< 256; i
++)
87 vectors
[i
] = bad_inthandler
;
89 #ifdef CONFIG_M68KFPU_EMU
91 vectors
[VEC_LINE11
] = fpu_emu
;
94 if (CPU_IS_040
&& !FPU_IS_EMU
) {
95 /* set up FPSP entry points */
96 asmlinkage
void dz_vec(void) asm ("dz");
97 asmlinkage
void inex_vec(void) asm ("inex");
98 asmlinkage
void ovfl_vec(void) asm ("ovfl");
99 asmlinkage
void unfl_vec(void) asm ("unfl");
100 asmlinkage
void snan_vec(void) asm ("snan");
101 asmlinkage
void operr_vec(void) asm ("operr");
102 asmlinkage
void bsun_vec(void) asm ("bsun");
103 asmlinkage
void fline_vec(void) asm ("fline");
104 asmlinkage
void unsupp_vec(void) asm ("unsupp");
106 vectors
[VEC_FPDIVZ
] = dz_vec
;
107 vectors
[VEC_FPIR
] = inex_vec
;
108 vectors
[VEC_FPOVER
] = ovfl_vec
;
109 vectors
[VEC_FPUNDER
] = unfl_vec
;
110 vectors
[VEC_FPNAN
] = snan_vec
;
111 vectors
[VEC_FPOE
] = operr_vec
;
112 vectors
[VEC_FPBRUC
] = bsun_vec
;
113 vectors
[VEC_LINE11
] = fline_vec
;
114 vectors
[VEC_FPUNSUP
] = unsupp_vec
;
117 if (CPU_IS_060
&& !FPU_IS_EMU
) {
118 /* set up IFPSP entry points */
119 asmlinkage
void snan_vec6(void) asm ("_060_fpsp_snan");
120 asmlinkage
void operr_vec6(void) asm ("_060_fpsp_operr");
121 asmlinkage
void ovfl_vec6(void) asm ("_060_fpsp_ovfl");
122 asmlinkage
void unfl_vec6(void) asm ("_060_fpsp_unfl");
123 asmlinkage
void dz_vec6(void) asm ("_060_fpsp_dz");
124 asmlinkage
void inex_vec6(void) asm ("_060_fpsp_inex");
125 asmlinkage
void fline_vec6(void) asm ("_060_fpsp_fline");
126 asmlinkage
void unsupp_vec6(void) asm ("_060_fpsp_unsupp");
127 asmlinkage
void effadd_vec6(void) asm ("_060_fpsp_effadd");
129 vectors
[VEC_FPNAN
] = snan_vec6
;
130 vectors
[VEC_FPOE
] = operr_vec6
;
131 vectors
[VEC_FPOVER
] = ovfl_vec6
;
132 vectors
[VEC_FPUNDER
] = unfl_vec6
;
133 vectors
[VEC_FPDIVZ
] = dz_vec6
;
134 vectors
[VEC_FPIR
] = inex_vec6
;
135 vectors
[VEC_LINE11
] = fline_vec6
;
136 vectors
[VEC_FPUNSUP
] = unsupp_vec6
;
137 vectors
[VEC_UNIMPEA
] = effadd_vec6
;
140 /* if running on an amiga, make the NMI interrupt do nothing */
142 vectors
[VEC_INT7
] = nmihandler
;