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