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 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 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 * 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 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