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