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