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