xref: /netbsd-src/sys/arch/m68k/m68k/vectors.c (revision 91b192d65cc0b267de4ed47c831d6b87feb69839)
1 /*	$NetBSD: vectors.c,v 1.3 2024/01/13 20:10:36 thorpej Exp $	*/
2 
3 /*-
4  * Copyright (c) 2024 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Jason R. Thorpe.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #ifdef _KERNEL_OPT
33 #include "opt_compat_netbsd.h"
34 #include "opt_compat_sunos.h"
35 #endif
36 
37 #include <sys/types.h>
38 
39 #include <machine/cpu.h>
40 #include <machine/vectors.h>
41 
42 #include <m68k/cacheops.h>
43 #include <m68k/frame.h>
44 
45 extern char illinst[];
46 extern char zerodiv[];
47 extern char chkinst[];
48 extern char trapvinst[];
49 extern char privinst[];
50 extern char trace[];
51 extern char fpfline[];
52 extern char badtrap[];
53 extern char coperr[];
54 extern char fmterr[];
55 extern char trap0[];
56 #if defined(COMPAT_13) || defined(COMPAT_SUNOS)
57 extern char trap1[];
58 #define	TRAP1_HANDLER		trap1
59 #else
60 #define	TRAP1_HANDLER		illinst
61 #endif /* COMPAT_13 || COMPAT_SUNOS */
62 extern char trap2[];
63 #ifdef COMPAT_16
64 extern char trap3[];
65 #define	TRAP3_HANDLER		trap3
66 #else
67 #define	TRAP3_HANDLER		illinst
68 #endif /* COMPAT_16 */
69 extern char trap12[];
70 extern char trap15[];
71 extern char fpfault[];
72 extern char fpunsupp[];
73 
74 extern char MACHINE_AV0_HANDLER[];
75 extern char MACHINE_AV1_HANDLER[];
76 extern char MACHINE_AV2_HANDLER[];
77 extern char MACHINE_AV3_HANDLER[];
78 extern char MACHINE_AV4_HANDLER[];
79 extern char MACHINE_AV5_HANDLER[];
80 extern char MACHINE_AV6_HANDLER[];
81 extern char MACHINE_AV7_HANDLER[];
82 
83 #ifdef MACHINE_BUSERR_HANDLER
84 extern char MACHINE_BUSERR_HANDLER[];
85 #endif
86 
87 #ifdef MACHINE_ADDRERR_HANDLER
88 extern char MACHINE_ADDRERR_HANDLER[];
89 #endif
90 
91 #ifdef __mc68010__
92 
93 #define	BUSERR_HANDLER		MACHINE_BUSERR_HANDLER
94 #define	ADDRERR_HANDLER		MACHINE_ADDRERR_HANDLER
95 
96 #else
97 
98 #if defined(M68020) || defined(M68030)
99 #ifdef MACHINE_BUSERR_HANDLER
100 #define	BUSERR_HANDLER2030	MACHINE_BUSERR_HANDLER
101 #else
102 extern char buserr2030[];
103 #define	BUSERR_HANDLER2030	buserr2030
104 #endif
105 #ifdef MACHINE_ADDRERR_HANDLER
106 #define	ADDRERR_HANDLER2030	MACHINE_ADDRERR_HANDLER
107 #else
108 extern char addrerr2030[];
109 #define	ADDRERR_HANDLER2030	addrerr2030
110 #endif
111 #if defined(M68040) || defined(M68060)
112 #define	NEED_FIXUP_2030
113 #else
114 #define	BUSERR_HANDLER		BUSERR_HANDLER2030
115 #define	ADDRERR_HANDLER		ADDRERR_HANDLER2030
116 #endif
117 #endif /* M68020 || M68030 */
118 
119 #if defined(M68040)
120 extern char buserr40[], addrerr4060[];
121 #ifdef FPSP
122 extern char bsun[], inex[], dz[], unfl[], operr[], ovfl[], snan[];
123 #define	FP_BSUN_HANDLER40	bsun
124 #define	FP_INEX_HANDLER40	inex
125 #define	FP_DZ_HANDLER40		dz
126 #define	FP_UNFL_HANDLER40	unfl
127 #define	FP_OPERR_HANDLER40	operr
128 #define	FP_OVFL_HANDLER40	ovfl
129 #define	FP_SNAN_HANDLER40	snan
130 #else
131 #define	FP_BSUN_HANDLER40	fpfault
132 #define	FP_INEX_HANDLER40	fpfault
133 #define	FP_DZ_HANDLER40		fpfault
134 #define	FP_UNFL_HANDLER40	fpfault
135 #define	FP_OPERR_HANDLER40	fpfault
136 #define	FP_OVFL_HANDLER40	fpfault
137 #define	FP_SNAN_HANDLER40	fpfault
138 #endif
139 #if defined(M68020) || defined(M68030) || defined(M68060)
140 #define	NEED_FIXUP_40
141 #else
142 #define	BUSERR_HANDLER		buserr40
143 #define	ADDRERR_HANDLER		addrerr4060
144 #define	FP_BSUN_HANDLER		FP_BSUN_HANDLER40
145 #define	FP_INEX_HANDLER		FP_INEX_HANDLER40
146 #define	FP_DZ_HANDLER		FP_DZ_HANDLER40
147 #define	FP_UNFL_HANDLER		FP_UNFL_HANDLER40
148 #define	FP_OPERR_HANDLER	FP_OPERR_HANDLER40
149 #define	FP_OVFL_HANDLER		FP_OVFL_HANDLER40
150 #define	FP_SNAN_HANDLER		FP_SNAN_HANDLER40
151 #endif
152 #endif /* M68040 */
153 
154 #if defined(M68060)
155 extern char buserr60[], addrerr4060[];
156 #ifdef M060SP
157 extern char FP_CALL_TOP[], I_CALL_TOP[];
158 #define	LINE111_HANDLER60	&FP_CALL_TOP[128 + 0x30]
159 #define	FP_INEX_HANDLER60	&FP_CALL_TOP[128 + 0x28]
160 #define	FP_DZ_HANDLER60		&FP_CALL_TOP[128 + 0x20]
161 #define	FP_UNFL_HANDLER60	&FP_CALL_TOP[128 + 0x18]
162 #define	FP_OPERR_HANDLER60	&FP_CALL_TOP[128 + 0x08]
163 #define	FP_OVFL_HANDLER60	&FP_CALL_TOP[128 + 0x10]
164 #define	FP_SNAN_HANDLER60	&FP_CALL_TOP[128 + 0x00]
165 #define	UNIMP_FP_DATA_HANDLER60	&FP_CALL_TOP[128 + 0x38]
166 #define	UNIMP_EA_HANDLER60	&FP_CALL_TOP[128 + 0x40]
167 #define	UNIMP_II_HANDLER60	&I_CALL_TOP[128 + 0x00]
168 #else
169 #define	LINE111_HANDLER60	fpfline
170 #define	FP_INEX_HANDLER60	fpfault
171 #define	FP_DZ_HANDLER60		fpfault
172 #define	FP_UNFL_HANDLER60	fpfault
173 #define	FP_OPERR_HANDLER60	fpfault
174 #define	FP_OVFL_HANDLER60	fpfault
175 #define	FP_SNAN_HANDLER60	fpfault
176 #define	UNIMP_FP_DATA_HANDLER60	fpunsupp
177 #define	UNIMP_EA_HANDLER60	badtrap		/* XXX illinst? */
178 #define	UNIMP_II_HANDLER60	illinst
179 #endif
180 #if defined(M68020) || defined(M68030) || defined(M68040)
181 #define	NEED_FIXUP_60
182 #else
183 #define	BUSERR_HANDLER		buserr60
184 #define	ADDRERR_HANDLER		addrerr4060
185 #define	LINE111_HANDLER		LINE111_HANDLER60
186 #define	FP_INEX_HANDLER		FP_INEX_HANDLER60
187 #define	FP_DZ_HANDLER		FP_DZ_HANDLER60
188 #define	FP_UNFL_HANDLER		FP_UNFL_HANDLER60
189 #define	FP_OPERR_HANDLER	FP_OPERR_HANDLER60
190 #define	FP_OVFL_HANDLER		FP_OVFL_HANDLER60
191 #define	FP_SNAN_HANDLER		FP_SNAN_HANDLER60
192 #define	UNIMP_FP_DATA_HANDLER	UNIMP_FP_DATA_HANDLER60
193 #define	UNIMP_EA_HANDLER	UNIMP_EA_HANDLER60
194 #define	UNIMP_II_HANDLER	UNIMP_II_HANDLER60
195 #endif
196 #endif /* M68060 */
197 
198 #endif /* __mc68010__ */
199 
200 #ifndef MACHINE_RESET_SP
201 #define	MACHINE_RESET_SP	NULL
202 #endif
203 
204 #ifndef MACHINE_RESET_PC
205 #define	MACHINE_RESET_PC	NULL
206 #endif
207 
208 #ifndef BUSERR_HANDLER
209 #define	BUSERR_HANDLER		badtrap
210 #endif
211 
212 #ifndef ADDRERR_HANDLER
213 #define	ADDRERR_HANDLER		badtrap
214 #endif
215 
216 #ifndef LINE1111_HANDLER
217 #define	LINE1111_HANDLER	fpfline
218 #endif
219 
220 #ifndef FP_BSUN_HANDLER
221 #define	FP_BSUN_HANDLER		fpfault
222 #endif
223 
224 #ifndef	FP_INEX_HANDLER
225 #define	FP_INEX_HANDLER		fpfault
226 #endif
227 
228 #ifndef FP_DZ_HANDLER
229 #define	FP_DZ_HANDLER		fpfault
230 #endif
231 
232 #ifndef FP_UNFL_HANDLER
233 #define	FP_UNFL_HANDLER		fpfault
234 #endif
235 
236 #ifndef FP_OPERR_HANDLER
237 #define	FP_OPERR_HANDLER	fpfault
238 #endif
239 
240 #ifndef FP_OVFL_HANDLER
241 #define	FP_OVFL_HANDLER		fpfault
242 #endif
243 
244 #ifndef FP_SNAN_HANDLER
245 #define	FP_SNAN_HANDLER		fpfault
246 #endif
247 
248 #ifndef UNIMP_FP_DATA_HANDLER
249 #define	UNIMP_FP_DATA_HANDLER	fpunsupp
250 #endif
251 
252 #ifndef UNIMP_EA_HANDLER
253 #define	UNIMP_EA_HANDLER	badtrap
254 #endif
255 
256 #ifndef UNIMP_II_HANDLER
257 #define	UNIMP_II_HANDLER	badtrap
258 #endif
259 
260 void *vectab[NVECTORS] = {
261 	[VECI_RIISP]		=	MACHINE_RESET_SP,
262 	[VECI_RIPC]		=	MACHINE_RESET_PC,
263 	[VECI_BUSERR]		=	BUSERR_HANDLER,
264 	[VECI_ADDRERR]		=	ADDRERR_HANDLER,
265 	[VECI_ILLINST]		=	illinst,
266 	[VECI_ZERODIV]		=	zerodiv,
267 	[VECI_CHK]		=	chkinst,
268 	[VECI_TRAPcc]		=	trapvinst,
269 	[VECI_PRIV]		=	privinst,
270 	[VECI_TRACE]		=	trace,
271 	[VECI_LINE1010]		=	illinst,
272 	[VECI_LINE1111]		=	LINE1111_HANDLER,
273 	[VECI_rsvd12]		=	badtrap,
274 	[VECI_CPV]		=	coperr,
275 	[VECI_FORMATERR]	=	fmterr,
276 	[VECI_UNINT_INTR]	=	badtrap,
277 	[VECI_rsvd16]		=	badtrap,
278 	[VECI_rsvd17]		=	badtrap,
279 	[VECI_rsvd18]		=	badtrap,
280 	[VECI_rsvd19]		=	badtrap,
281 	[VECI_rsvd20]		=	badtrap,
282 	[VECI_rsvd21]		=	badtrap,
283 	[VECI_rsvd22]		=	badtrap,
284 	[VECI_rsvd23]		=	badtrap,
285 	[VECI_INTRAV0]		=	MACHINE_AV0_HANDLER,
286 	[VECI_INTRAV1]		=	MACHINE_AV1_HANDLER,
287 	[VECI_INTRAV2]		=	MACHINE_AV2_HANDLER,
288 	[VECI_INTRAV3]		=	MACHINE_AV3_HANDLER,
289 	[VECI_INTRAV4]		=	MACHINE_AV4_HANDLER,
290 	[VECI_INTRAV5]		=	MACHINE_AV5_HANDLER,
291 	[VECI_INTRAV6]		=	MACHINE_AV6_HANDLER,
292 	[VECI_INTRAV7]		=	MACHINE_AV7_HANDLER,
293 	[VECI_TRAP0]		=	trap0,		/* syscalls */
294 	[VECI_TRAP1]		=	TRAP1_HANDLER,	/* 1.3 sigreturn */
295 	[VECI_TRAP2]		=	trap2,		/* trace */
296 	[VECI_TRAP3]		=	TRAP3_HANDLER,	/* 1.6 sigreturn */
297 	[VECI_TRAP4]		=	illinst,
298 	[VECI_TRAP5]		=	illinst,
299 	[VECI_TRAP6]		=	illinst,
300 	[VECI_TRAP7]		=	illinst,
301 	[VECI_TRAP8]		=	illinst,
302 	[VECI_TRAP9]		=	illinst,
303 	[VECI_TRAP10]		=	illinst,
304 	[VECI_TRAP11]		=	illinst,
305 	[VECI_TRAP12]		=	trap12,
306 	[VECI_TRAP13]		=	illinst,
307 	[VECI_TRAP14]		=	illinst,
308 	[VECI_TRAP15]		=	trap15,
309 	[VECI_FP_BSUN]		=	FP_BSUN_HANDLER,
310 	[VECI_FP_INEX]		=	FP_INEX_HANDLER,
311 	[VECI_FP_DZ]		=	FP_DZ_HANDLER,
312 	[VECI_FP_UNFL]		=	FP_UNFL_HANDLER,
313 	[VECI_FP_OPERR]		=	FP_OPERR_HANDLER,
314 	[VECI_FP_OVFL]		=	FP_OVFL_HANDLER,
315 	[VECI_FP_SNAN]		=	FP_SNAN_HANDLER,
316 	[VECI_UNIMP_FP_DATA]	=	UNIMP_FP_DATA_HANDLER,
317 	[VECI_PMMU_CONF]	=	badtrap,
318 	[VECI_PMMU_ILLOP]	=	badtrap,
319 	[VECI_PMMU_ACCESS]	=	badtrap,
320 	[VECI_rsvd59]		=	badtrap,
321 	[VECI_UNIMP_EA]		=	UNIMP_EA_HANDLER,
322 	[VECI_UNIMP_II]		=	UNIMP_II_HANDLER,
323 	[VECI_rsvd62]		=	badtrap,
324 	[VECI_rsvd63]		=	badtrap,
325 	[VECI_USRVEC_START+0]	=	badtrap,
326 	[VECI_USRVEC_START+1]	=	badtrap,
327 	[VECI_USRVEC_START+2]	=	badtrap,
328 	[VECI_USRVEC_START+3]	=	badtrap,
329 	[VECI_USRVEC_START+4]	=	badtrap,
330 	[VECI_USRVEC_START+5]	=	badtrap,
331 	[VECI_USRVEC_START+6]	=	badtrap,
332 	[VECI_USRVEC_START+7]	=	badtrap,
333 	[VECI_USRVEC_START+8]	=	badtrap,
334 	[VECI_USRVEC_START+9]	=	badtrap,
335 	[VECI_USRVEC_START+10]	=	badtrap,
336 	[VECI_USRVEC_START+11]	=	badtrap,
337 	[VECI_USRVEC_START+12]	=	badtrap,
338 	[VECI_USRVEC_START+13]	=	badtrap,
339 	[VECI_USRVEC_START+14]	=	badtrap,
340 	[VECI_USRVEC_START+15]	=	badtrap,
341 	[VECI_USRVEC_START+16]	=	badtrap,
342 	[VECI_USRVEC_START+17]	=	badtrap,
343 	[VECI_USRVEC_START+18]	=	badtrap,
344 	[VECI_USRVEC_START+19]	=	badtrap,
345 	[VECI_USRVEC_START+20]	=	badtrap,
346 	[VECI_USRVEC_START+21]	=	badtrap,
347 	[VECI_USRVEC_START+22]	=	badtrap,
348 	[VECI_USRVEC_START+23]	=	badtrap,
349 	[VECI_USRVEC_START+24]	=	badtrap,
350 	[VECI_USRVEC_START+25]	=	badtrap,
351 	[VECI_USRVEC_START+26]	=	badtrap,
352 	[VECI_USRVEC_START+27]	=	badtrap,
353 	[VECI_USRVEC_START+28]	=	badtrap,
354 	[VECI_USRVEC_START+29]	=	badtrap,
355 	[VECI_USRVEC_START+30]	=	badtrap,
356 	[VECI_USRVEC_START+31]	=	badtrap,
357 	[VECI_USRVEC_START+32]	=	badtrap,
358 	[VECI_USRVEC_START+33]	=	badtrap,
359 	[VECI_USRVEC_START+34]	=	badtrap,
360 	[VECI_USRVEC_START+35]	=	badtrap,
361 	[VECI_USRVEC_START+36]	=	badtrap,
362 	[VECI_USRVEC_START+37]	=	badtrap,
363 	[VECI_USRVEC_START+38]	=	badtrap,
364 	[VECI_USRVEC_START+39]	=	badtrap,
365 	[VECI_USRVEC_START+40]	=	badtrap,
366 	[VECI_USRVEC_START+41]	=	badtrap,
367 	[VECI_USRVEC_START+42]	=	badtrap,
368 	[VECI_USRVEC_START+43]	=	badtrap,
369 	[VECI_USRVEC_START+44]	=	badtrap,
370 	[VECI_USRVEC_START+45]	=	badtrap,
371 	[VECI_USRVEC_START+46]	=	badtrap,
372 	[VECI_USRVEC_START+47]	=	badtrap,
373 	[VECI_USRVEC_START+48]	=	badtrap,
374 	[VECI_USRVEC_START+49]	=	badtrap,
375 	[VECI_USRVEC_START+50]	=	badtrap,
376 	[VECI_USRVEC_START+51]	=	badtrap,
377 	[VECI_USRVEC_START+52]	=	badtrap,
378 	[VECI_USRVEC_START+53]	=	badtrap,
379 	[VECI_USRVEC_START+54]	=	badtrap,
380 	[VECI_USRVEC_START+55]	=	badtrap,
381 	[VECI_USRVEC_START+56]	=	badtrap,
382 	[VECI_USRVEC_START+57]	=	badtrap,
383 	[VECI_USRVEC_START+58]	=	badtrap,
384 	[VECI_USRVEC_START+59]	=	badtrap,
385 	[VECI_USRVEC_START+60]	=	badtrap,
386 	[VECI_USRVEC_START+61]	=	badtrap,
387 	[VECI_USRVEC_START+62]	=	badtrap,
388 	[VECI_USRVEC_START+63]	=	badtrap,
389 	[VECI_USRVEC_START+64]	=	badtrap,
390 	[VECI_USRVEC_START+65]	=	badtrap,
391 	[VECI_USRVEC_START+66]	=	badtrap,
392 	[VECI_USRVEC_START+67]	=	badtrap,
393 	[VECI_USRVEC_START+68]	=	badtrap,
394 	[VECI_USRVEC_START+69]	=	badtrap,
395 	[VECI_USRVEC_START+70]	=	badtrap,
396 	[VECI_USRVEC_START+71]	=	badtrap,
397 	[VECI_USRVEC_START+72]	=	badtrap,
398 	[VECI_USRVEC_START+73]	=	badtrap,
399 	[VECI_USRVEC_START+74]	=	badtrap,
400 	[VECI_USRVEC_START+75]	=	badtrap,
401 	[VECI_USRVEC_START+76]	=	badtrap,
402 	[VECI_USRVEC_START+77]	=	badtrap,
403 	[VECI_USRVEC_START+78]	=	badtrap,
404 	[VECI_USRVEC_START+79]	=	badtrap,
405 	[VECI_USRVEC_START+80]	=	badtrap,
406 	[VECI_USRVEC_START+81]	=	badtrap,
407 	[VECI_USRVEC_START+82]	=	badtrap,
408 	[VECI_USRVEC_START+83]	=	badtrap,
409 	[VECI_USRVEC_START+84]	=	badtrap,
410 	[VECI_USRVEC_START+85]	=	badtrap,
411 	[VECI_USRVEC_START+86]	=	badtrap,
412 	[VECI_USRVEC_START+87]	=	badtrap,
413 	[VECI_USRVEC_START+88]	=	badtrap,
414 	[VECI_USRVEC_START+89]	=	badtrap,
415 	[VECI_USRVEC_START+90]	=	badtrap,
416 	[VECI_USRVEC_START+91]	=	badtrap,
417 	[VECI_USRVEC_START+92]	=	badtrap,
418 	[VECI_USRVEC_START+93]	=	badtrap,
419 	[VECI_USRVEC_START+94]	=	badtrap,
420 	[VECI_USRVEC_START+95]	=	badtrap,
421 	[VECI_USRVEC_START+96]	=	badtrap,
422 	[VECI_USRVEC_START+97]	=	badtrap,
423 	[VECI_USRVEC_START+98]	=	badtrap,
424 	[VECI_USRVEC_START+99]	=	badtrap,
425 	[VECI_USRVEC_START+100]	=	badtrap,
426 	[VECI_USRVEC_START+101]	=	badtrap,
427 	[VECI_USRVEC_START+102]	=	badtrap,
428 	[VECI_USRVEC_START+103]	=	badtrap,
429 	[VECI_USRVEC_START+104]	=	badtrap,
430 	[VECI_USRVEC_START+105]	=	badtrap,
431 	[VECI_USRVEC_START+106]	=	badtrap,
432 	[VECI_USRVEC_START+107]	=	badtrap,
433 	[VECI_USRVEC_START+108]	=	badtrap,
434 	[VECI_USRVEC_START+109]	=	badtrap,
435 	[VECI_USRVEC_START+110]	=	badtrap,
436 	[VECI_USRVEC_START+111]	=	badtrap,
437 	[VECI_USRVEC_START+112]	=	badtrap,
438 	[VECI_USRVEC_START+113]	=	badtrap,
439 	[VECI_USRVEC_START+114]	=	badtrap,
440 	[VECI_USRVEC_START+115]	=	badtrap,
441 	[VECI_USRVEC_START+116]	=	badtrap,
442 	[VECI_USRVEC_START+117]	=	badtrap,
443 	[VECI_USRVEC_START+118]	=	badtrap,
444 	[VECI_USRVEC_START+119]	=	badtrap,
445 	[VECI_USRVEC_START+120]	=	badtrap,
446 	[VECI_USRVEC_START+121]	=	badtrap,
447 	[VECI_USRVEC_START+122]	=	badtrap,
448 	[VECI_USRVEC_START+123]	=	badtrap,
449 	[VECI_USRVEC_START+124]	=	badtrap,
450 	[VECI_USRVEC_START+125]	=	badtrap,
451 	[VECI_USRVEC_START+126]	=	badtrap,
452 	[VECI_USRVEC_START+127]	=	badtrap,
453 	[VECI_USRVEC_START+128]	=	badtrap,
454 	[VECI_USRVEC_START+129]	=	badtrap,
455 	[VECI_USRVEC_START+130]	=	badtrap,
456 	[VECI_USRVEC_START+131]	=	badtrap,
457 	[VECI_USRVEC_START+132]	=	badtrap,
458 	[VECI_USRVEC_START+133]	=	badtrap,
459 	[VECI_USRVEC_START+134]	=	badtrap,
460 	[VECI_USRVEC_START+135]	=	badtrap,
461 	[VECI_USRVEC_START+136]	=	badtrap,
462 	[VECI_USRVEC_START+137]	=	badtrap,
463 	[VECI_USRVEC_START+138]	=	badtrap,
464 	[VECI_USRVEC_START+139]	=	badtrap,
465 	[VECI_USRVEC_START+140]	=	badtrap,
466 	[VECI_USRVEC_START+141]	=	badtrap,
467 	[VECI_USRVEC_START+142]	=	badtrap,
468 	[VECI_USRVEC_START+143]	=	badtrap,
469 	[VECI_USRVEC_START+144]	=	badtrap,
470 	[VECI_USRVEC_START+145]	=	badtrap,
471 	[VECI_USRVEC_START+146]	=	badtrap,
472 	[VECI_USRVEC_START+147]	=	badtrap,
473 	[VECI_USRVEC_START+148]	=	badtrap,
474 	[VECI_USRVEC_START+149]	=	badtrap,
475 	[VECI_USRVEC_START+150]	=	badtrap,
476 	[VECI_USRVEC_START+151]	=	badtrap,
477 	[VECI_USRVEC_START+152]	=	badtrap,
478 	[VECI_USRVEC_START+153]	=	badtrap,
479 	[VECI_USRVEC_START+154]	=	badtrap,
480 	[VECI_USRVEC_START+155]	=	badtrap,
481 	[VECI_USRVEC_START+156]	=	badtrap,
482 	[VECI_USRVEC_START+157]	=	badtrap,
483 	[VECI_USRVEC_START+158]	=	badtrap,
484 	[VECI_USRVEC_START+159]	=	badtrap,
485 	[VECI_USRVEC_START+160]	=	badtrap,
486 	[VECI_USRVEC_START+161]	=	badtrap,
487 	[VECI_USRVEC_START+162]	=	badtrap,
488 	[VECI_USRVEC_START+163]	=	badtrap,
489 	[VECI_USRVEC_START+164]	=	badtrap,
490 	[VECI_USRVEC_START+165]	=	badtrap,
491 	[VECI_USRVEC_START+166]	=	badtrap,
492 	[VECI_USRVEC_START+167]	=	badtrap,
493 	[VECI_USRVEC_START+168]	=	badtrap,
494 	[VECI_USRVEC_START+169]	=	badtrap,
495 	[VECI_USRVEC_START+170]	=	badtrap,
496 	[VECI_USRVEC_START+171]	=	badtrap,
497 	[VECI_USRVEC_START+172]	=	badtrap,
498 	[VECI_USRVEC_START+173]	=	badtrap,
499 	[VECI_USRVEC_START+174]	=	badtrap,
500 	[VECI_USRVEC_START+175]	=	badtrap,
501 	[VECI_USRVEC_START+176]	=	badtrap,
502 	[VECI_USRVEC_START+177]	=	badtrap,
503 	[VECI_USRVEC_START+178]	=	badtrap,
504 	[VECI_USRVEC_START+179]	=	badtrap,
505 	[VECI_USRVEC_START+180]	=	badtrap,
506 	[VECI_USRVEC_START+181]	=	badtrap,
507 	[VECI_USRVEC_START+182]	=	badtrap,
508 	[VECI_USRVEC_START+183]	=	badtrap,
509 	[VECI_USRVEC_START+184]	=	badtrap,
510 	[VECI_USRVEC_START+185]	=	badtrap,
511 	[VECI_USRVEC_START+186]	=	badtrap,
512 	[VECI_USRVEC_START+187]	=	badtrap,
513 	[VECI_USRVEC_START+188]	=	badtrap,
514 	[VECI_USRVEC_START+189]	=	badtrap,
515 	[VECI_USRVEC_START+190]	=	badtrap,
516 	[VECI_USRVEC_START+191]	=	badtrap,
517 };
518 
519 void **saved_vbr;
520 
521 /*
522  * vec_init --
523  *	Initialize the vector table and Vector Base Register.
524  *
525  *	N.B. We rely on the cputype variable having been initialized
526  *	and the MMU having been enabled.
527  */
528 void
vec_init(void)529 vec_init(void)
530 {
531 #if !defined(__mc68010__) && \
532     (defined(NEED_FIXUP_2030) || defined(NEED_FIXUP_40) || \
533      defined(NEED_FIXUP_60))
534 	switch (cputype) {
535 #ifdef NEED_FIXUP_2030
536 	case CPU_68020:
537 	case CPU_68030:
538 		vectab[VECI_BUSERR]        = BUSERR_HANDLER2030;
539 		vectab[VECI_ADDRERR]       = ADDRERR_HANDLER2030;
540 		break;
541 #endif /* NEED_FIXUP_2030 */
542 
543 #ifdef NEED_FIXUP_40
544 	case CPU_68040:
545 		vectab[VECI_BUSERR]        = buserr40;
546 		vectab[VECI_ADDRERR]       = addrerr4060;
547 		vectab[VECI_FP_BSUN]       = FP_BSUN_HANDLER40;
548 		vectab[VECI_FP_INEX]       = FP_INEX_HANDLER40;
549 		vectab[VECI_FP_DZ]         = FP_DZ_HANDLER40;
550 		vectab[VECI_FP_UNFL]       = FP_UNFL_HANDLER40;
551 		vectab[VECI_FP_OPERR]      = FP_OPERR_HANDLER40;
552 		vectab[VECI_FP_OVFL]       = FP_OVFL_HANDLER40;
553 		vectab[VECI_FP_SNAN]       = FP_SNAN_HANDLER40;
554 		DCIS();
555 		break;
556 #endif /* NEED_FIXUP_40 */
557 
558 #ifdef NEED_FIXUP_60
559 	case CPU_68060:
560 		vectab[VECI_BUSERR]        = buserr60;
561 		vectab[VECI_ADDRERR]       = addrerr4060;
562 		vectab[VECI_FP_INEX]       = FP_INEX_HANDLER60;
563 		vectab[VECI_FP_DZ]         = FP_DZ_HANDLER60;
564 		vectab[VECI_FP_UNFL]       = FP_UNFL_HANDLER60;
565 		vectab[VECI_FP_OPERR]      = FP_OPERR_HANDLER60;
566 		vectab[VECI_FP_OVFL]       = FP_OVFL_HANDLER60;
567 		vectab[VECI_FP_SNAN]       = FP_SNAN_HANDLER60;
568 		vectab[VECI_UNIMP_FP_DATA] = UNIMP_FP_DATA_HANDLER60;
569 		vectab[VECI_UNIMP_EA]      = UNIMP_EA_HANDLER60;
570 		vectab[VECI_UNIMP_II]      = UNIMP_II_HANDLER60;
571 		DCIS();
572 		break;
573 #endif /* NEED_FIXUP_60 */
574 	default:
575 		panic("vec_init");
576 		break;
577 	}
578 #endif
579 	saved_vbr = getvbr();
580 	setvbr(vectab);
581 }
582 
583 /*
584  * vec_reset --
585  *	Reset the Vector Base Register.
586  */
587 void
vec_reset(void)588 vec_reset(void)
589 {
590 	setvbr(saved_vbr);
591 }
592 
593 /*
594  * vec_get_entry --
595  *	Get a vector table entry.
596  */
597 void *
vec_get_entry(int vec)598 vec_get_entry(int vec)
599 {
600 	KASSERT(vec >= 0);
601 	KASSERT(vec < NVECTORS);
602 	return vectab[vec];
603 }
604 
605 /*
606  * vec_set_entry --
607  *	Set a vector table entry.
608  */
609 void
vec_set_entry(int vec,void * addr)610 vec_set_entry(int vec, void *addr)
611 {
612 	KASSERT(vec >= 0);
613 	KASSERT(vec < NVECTORS);
614 	vectab[vec] = addr;
615 #if defined(M68040) || defined(M68060)
616 	if (cputype == CPU_68040 || cputype == CPU_68060) {
617 		DCIS();
618 	}
619 #endif
620 }
621