Module Name: src Committed By: thorpej Date: Sat Jan 13 17:10:03 UTC 2024
Added Files: src/sys/arch/m68k/include: vectors.h src/sys/arch/m68k/m68k: vectors.c Log Message: Add a common vector table implementation for m68k platforms. To generate a diff of this commit: cvs rdiff -u -r0 -r1.1 src/sys/arch/m68k/include/vectors.h cvs rdiff -u -r0 -r1.1 src/sys/arch/m68k/m68k/vectors.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Added files: Index: src/sys/arch/m68k/include/vectors.h diff -u /dev/null src/sys/arch/m68k/include/vectors.h:1.1 --- /dev/null Sat Jan 13 17:10:03 2024 +++ src/sys/arch/m68k/include/vectors.h Sat Jan 13 17:10:03 2024 @@ -0,0 +1,133 @@ +/* $NetBSD: vectors.h,v 1.1 2024/01/13 17:10:03 thorpej Exp $ */ + +/*- + * Copyright (c) 2024 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Jason R. Thorpe. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _M68K_VECTORS_H_ +#define _M68K_VECTORS_H_ + +/* + * Vector numbers (*4 for byte offset into table). + * + * VECI_RIISP and VECI_RIPC are fetched using Supervisor Program + * space. The rest, Supervisor Data space. + * + * VECI_PMMU_ILLOP and VECI_PMMU_ACCESS are defined for the 68020, but + * not used on the 68030. + * + * VECI_CPV and VECI_PMMU_CONF are defined for the 68020 and 68030, but + * not used on the 68040 or 68060. + * + * VECI_UNIMP_FP_DATA, VECI_UNIMP_EA and VECI_UNIMP_II are defined for + * the 68060 and reserved on all other processors. + */ +#define VECI_RIISP 0 /* Reset Initial Interrupt SP */ +#define VECI_RIPC 1 /* Reset Initial PC */ +#define VECI_BUSERR 2 /* Bus Error */ +#define VECI_ADDRERR 3 /* Address Error */ +#define VECI_ILLINST 4 /* Illegal Instruction */ +#define VECI_ZERODIV 5 /* Zero Divide */ +#define VECI_CHK 6 /* CHK, CHK2 instruction */ +#define VECI_TRAPcc 7 /* cpTRAPcc, TRAPcc, TRAPV */ +#define VECI_PRIV 8 /* Privilege Violation */ +#define VECI_TRACE 9 /* Trace */ +#define VECI_LINE1010 10 /* Line 1010 Emulator */ +#define VECI_LINE1111 11 /* Line 1111 Emulator */ +#define VECI_rsvd12 12 /* unassigned, reserved */ +#define VECI_CPV 13 /* Coprocessor Prototol Violation */ +#define VECI_FORMATERR 14 /* Format Error */ +#define VECI_UNINT_INTR 15 /* Uninitialized Interrupt */ +#define VECI_rsvd16 16 /* unassigned, reserved */ +#define VECI_rsvd17 17 /* unassigned, reserved */ +#define VECI_rsvd18 18 /* unassigned, reserved */ +#define VECI_rsvd19 19 /* unassigned, reserved */ +#define VECI_rsvd20 20 /* unassigned, reserved */ +#define VECI_rsvd21 21 /* unassigned, reserved */ +#define VECI_rsvd22 22 /* unassigned, reserved */ +#define VECI_rsvd23 23 /* unassigned, reserved */ +#define VECI_SPURIOUS_INTR 24 /* Spurious Interrupt */ +#define VECI_INTRAV1 25 /* Level 1 Interrupt Autovector */ +#define VECI_INTRAV2 26 /* Level 2 Interrupt Autovector */ +#define VECI_INTRAV3 27 /* Level 3 Interrupt Autovector */ +#define VECI_INTRAV4 28 /* Level 4 Interrupt Autovector */ +#define VECI_INTRAV5 29 /* Level 5 Interrupt Autovector */ +#define VECI_INTRAV6 30 /* Level 6 Interrupt Autovector */ +#define VECI_INTRAV7 31 /* Level 7 Interrupt Autovector */ +#define VECI_TRAP0 32 /* Trap #0 instruction */ +#define VECI_TRAP1 33 /* Trap #1 instruction */ +#define VECI_TRAP2 34 /* Trap #2 instruction */ +#define VECI_TRAP3 35 /* Trap #3 instruction */ +#define VECI_TRAP4 36 /* Trap #4 instruction */ +#define VECI_TRAP5 37 /* Trap #5 instruction */ +#define VECI_TRAP6 38 /* Trap #6 instruction */ +#define VECI_TRAP7 39 /* Trap #7 instruction */ +#define VECI_TRAP8 40 /* Trap #8 instruction */ +#define VECI_TRAP9 41 /* Trap #9 instruction */ +#define VECI_TRAP10 42 /* Trap #10 instruction */ +#define VECI_TRAP11 43 /* Trap #11 instruction */ +#define VECI_TRAP12 44 /* Trap #12 instruction */ +#define VECI_TRAP13 45 /* Trap #13 instruction */ +#define VECI_TRAP14 46 /* Trap #14 instruction */ +#define VECI_TRAP15 47 /* Trap #15 instruction */ +#define VECI_FP_BSUN 48 /* FPCP Branch or Set on Unordered */ +#define VECI_FP_INEX 49 /* FPCP Inexact Result */ +#define VECI_FP_DZ 50 /* FPCP Divide by Zero */ +#define VECI_FP_UNFL 51 /* FPCP Underflow */ +#define VECI_FP_OPERR 52 /* FPCP Operand Error */ +#define VECI_FP_OVFL 53 /* FPCP Overflow */ +#define VECI_FP_SNAN 54 /* FPCP Signalling NaN */ +#define VECI_UNIMP_FP_DATA 55 /* FP Unimplemented Data Type */ +#define VECI_PMMU_CONF 56 /* PMMU Configuration */ +#define VECI_PMMU_ILLOP 57 /* PMMU Illegal Operation */ +#define VECI_PMMU_ACCESS 58 /* PMMU Access Level Violation */ +#define VECI_rsvd59 59 /* unassigned, reserved */ +#define VECI_UNIMP_EA 60 /* Unimplemented Effective Address */ +#define VECI_UNIMP_II 61 /* Umimplemented Integer Instruction */ +#define VECI_rsvd62 62 /* unassigned, reserved */ +#define VECI_rsvd63 63 /* unassigned, reserved */ +#define VECI_USRVEC_START 64 /* User defined vectors (192) */ + +#define NVECTORS 256 + +#define VECI_INTRAV(ipl) ((ipl) + VECI_SPURIOUS_INTR) +#define VECI_TRAP(x) ((x) + VECI_TRAP0) + +#define VECI_TO_VEC(x) ((x) << 2) +#define VEC_TO_VECI(x) ((unsigned int)(x) >> 2) + +#ifdef _KERNEL + +extern void *vectab[NVECTORS]; + +void vec_init(void); +void vec_reset(void); + +#endif /* _KERNEL */ + +#endif /* _M68K_VECTORS_H_ */ Index: src/sys/arch/m68k/m68k/vectors.c diff -u /dev/null src/sys/arch/m68k/m68k/vectors.c:1.1 --- /dev/null Sat Jan 13 17:10:03 2024 +++ src/sys/arch/m68k/m68k/vectors.c Sat Jan 13 17:10:03 2024 @@ -0,0 +1,552 @@ +/* $NetBSD: vectors.c,v 1.1 2024/01/13 17:10:03 thorpej Exp $ */ + +/*- + * Copyright (c) 2024 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Jason R. Thorpe. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/types.h> + +#include <machine/cpu.h> +#include <machine/vectors.h> + +#include <m68k/cacheops.h> +#include <m68k/frame.h> + +extern char illinst[]; +extern char zerodiv[]; +extern char chkinst[]; +extern char trapvinst[]; +extern char privinst[]; +extern char trace[]; +extern char fpfline[]; +extern char badtrap[]; +extern char coperr[]; +extern char fmterr[]; +extern char trap0[]; +#ifdef COMPAT_13 +extern char trap1[]; +#define TRAP1_HANDLER trap1 +#else +#define TRAP1_HANDLER illinst +#endif /* COMPAT_13 */ +extern char trap2[]; +#ifdef COMPAT_16 +extern char trap3[]; +#define TRAP3_HANDLER trap3 +#else +#define TRAP3_HANDLER illinst +#endif /* COMPAT_16 */ +extern char trap12[]; +extern char trap15[]; +extern char fpfault[]; +extern char fpunsupp[]; + +extern char MACHINE_AV0_HANDLER[]; +extern char MACHINE_AV1_HANDLER[]; +extern char MACHINE_AV2_HANDLER[]; +extern char MACHINE_AV3_HANDLER[]; +extern char MACHINE_AV4_HANDLER[]; +extern char MACHINE_AV5_HANDLER[]; +extern char MACHINE_AV6_HANDLER[]; +extern char MACHINE_AV7_HANDLER[]; + +#ifndef __mc68010__ + +#if defined(M68020) || defined(M68030) +extern char busaddrerr2030[]; +#if defined(M68040) || defined(M68060) +#define NEED_FIXUP_2030 +#else +#define BUSERR_HANDLER busaddrerr2030 +#define ADDRERR_HANDLER busaddrerr2030 +#endif +#endif /* M68020 || M68030 */ + +#if defined(M68040) +extern char buserr40[], addrerr4060[]; +#ifdef FPSP +extern char bsun[], inex[], dz[], unfl[], operr[], ovfl[], snan[]; +#define FP_BSUN_HANDLER40 bsun +#define FP_INEX_HANDLER40 inex +#define FP_DZ_HANDLER40 dz +#define FP_UNFL_HANDLER40 unfl +#define FP_OPERR_HANDLER40 operr +#define FP_OVFL_HANDLER40 ovfl +#define FP_SNAN_HANDLER40 snan +#else +#define FP_BSUN_HANDLER40 fpfault +#define FP_INEX_HANDLER40 fpfault +#define FP_DZ_HANDLER40 fpfault +#define FP_UNFL_HANDLER40 fpfault +#define FP_OPERR_HANDLER40 fpfault +#define FP_OVFL_HANDLER40 fpfault +#define FP_SNAN_HANDLER40 fpfault +#endif +#if defined(M68020) || defined(M68030) || defined(M68060) +#define NEED_FIXUP_40 +#else +#define BUSERR_HANDLER buserr40 +#define ADDRERR_HANDLER addrerr4060 +#define FP_BSUN_HANDLER FP_BSUN_HANDLER40 +#define FP_INEX_HANDLER FP_INEX_HANDLER40 +#define FP_DZ_HANDLER FP_DZ_HANDLER40 +#define FP_UNFL_HANDLER FP_UNFL_HANDLER40 +#define FP_OPERR_HANDLER FP_OPERR_HANDLER40 +#define FP_OVFL_HANDLER FP_OVFL_HANDLER40 +#define FP_SNAN_HANDLER FP_SNAN_HANDLER40 +#endif +#endif /* M68040 */ + +#if defined(M68060) +extern char buserr60[], addrerr4060[]; +#ifdef M060SP +extern char FP_CALL_TOP[], I_CALL_TOP[]; +#define LINE111_HANDLER60 &FP_CALL_TOP[128 + 0x30] +#define FP_INEX_HANDLER60 &FP_CALL_TOP[128 + 0x28] +#define FP_DZ_HANDLER60 &FP_CALL_TOP[128 + 0x20] +#define FP_UNFL_HANDLER60 &FP_CALL_TOP[128 + 0x18] +#define FP_OPERR_HANDLER60 &FP_CALL_TOP[128 + 0x08] +#define FP_OVFL_HANDLER60 &FP_CALL_TOP[128 + 0x10] +#define FP_SNAN_HANDLER60 &FP_CALL_TOP[128 + 0x00] +#define UNIMP_FP_DATA_HANDLER60 &FP_CALL_TOP[128 + 0x38] +#define UNIMP_EA_HANDLER60 &FP_CALL_TOP[128 + 0x40] +#define UNIMP_II_HANDLER60 &I_CALL_TOP[128 + 0x00] +#else +#define LINE111_HANDLER60 fpfline +#define FP_INEX_HANDLER60 fpfault +#define FP_DZ_HANDLER60 fpfault +#define FP_UNFL_HANDLER60 fpfault +#define FP_OPERR_HANDLER60 fpfault +#define FP_OVFL_HANDLER60 fpfault +#define FP_SNAN_HANDLER60 fpfault +#define UNIMP_FP_DATA_HANDLER60 fpunsupp +#define UNIMP_EA_HANDLER60 badtrap /* XXX illinst? */ +#define UNIMP_II_HANDLER60 illinst +#endif +#if defined(M68020) || defined(M68030) || defined(M68040) +#define NEED_FIXUP_60 +#else +#define BUSERR_HANDLER buserr60 +#define ADDRERR_HANDLER addrerr4060 +#define LINE111_HANDLER LINE111_HANDLER60 +#define FP_INEX_HANDLER FP_INEX_HANDLER60 +#define FP_DZ_HANDLER FP_DZ_HANDLER60 +#define FP_UNFL_HANDLER FP_UNFL_HANDLER60 +#define FP_OPERR_HANDLER FP_OPERR_HANDLER60 +#define FP_OVFL_HANDLER FP_OVFL_HANDLER60 +#define FP_SNAN_HANDLER FP_SNAN_HANDLER60 +#define UNIMP_FP_DATA_HANDLER UNIMP_FP_DATA_HANDLER60 +#define UNIMP_EA_HANDLER UNIMP_EA_HANDLER60 +#define UNIMP_II_HANDLER UNIMP_II_HANDLER60 +#endif +#endif /* M68060 */ + +#endif /* __mc68010__ */ + +#ifndef BUSERR_HANDLER +#define BUSERR_HANDLER badtrap +#endif + +#ifndef ADDRERR_HANDLER +#define ADDRERR_HANDLER badtrap +#endif + +#ifndef LINE1111_HANDLER +#define LINE1111_HANDLER fpfline +#endif + +#ifndef FP_BSUN_HANDLER +#define FP_BSUN_HANDLER fpfault +#endif + +#ifndef FP_INEX_HANDLER +#define FP_INEX_HANDLER fpfault +#endif + +#ifndef FP_DZ_HANDLER +#define FP_DZ_HANDLER fpfault +#endif + +#ifndef FP_UNFL_HANDLER +#define FP_UNFL_HANDLER fpfault +#endif + +#ifndef FP_OPERR_HANDLER +#define FP_OPERR_HANDLER fpfault +#endif + +#ifndef FP_OVFL_HANDLER +#define FP_OVFL_HANDLER fpfault +#endif + +#ifndef FP_SNAN_HANDLER +#define FP_SNAN_HANDLER fpfault +#endif + +#ifndef UNIMP_FP_DATA_HANDLER +#define UNIMP_FP_DATA_HANDLER fpunsupp +#endif + +#ifndef UNIMP_EA_HANDLER +#define UNIMP_EA_HANDLER badtrap +#endif + +#ifndef UNIMP_II_HANDLER +#define UNIMP_II_HANDLER badtrap +#endif + +void *vectab[NVECTORS] = { + [VECI_BUSERR] = BUSERR_HANDLER, + [VECI_ADDRERR] = ADDRERR_HANDLER, + [VECI_ILLINST] = illinst, + [VECI_ZERODIV] = zerodiv, + [VECI_CHK] = chkinst, + [VECI_TRAPcc] = trapvinst, + [VECI_PRIV] = privinst, + [VECI_TRACE] = trace, + [VECI_LINE1010] = illinst, + [VECI_LINE1111] = LINE1111_HANDLER, + [VECI_rsvd12] = badtrap, + [VECI_CPV] = coperr, + [VECI_FORMATERR] = fmterr, + [VECI_UNINT_INTR] = badtrap, + [VECI_rsvd16] = badtrap, + [VECI_rsvd17] = badtrap, + [VECI_rsvd18] = badtrap, + [VECI_rsvd19] = badtrap, + [VECI_rsvd20] = badtrap, + [VECI_rsvd21] = badtrap, + [VECI_rsvd22] = badtrap, + [VECI_rsvd23] = badtrap, + [VECI_SPURIOUS_INTR] = MACHINE_AV0_HANDLER, + [VECI_INTRAV1] = MACHINE_AV1_HANDLER, + [VECI_INTRAV2] = MACHINE_AV2_HANDLER, + [VECI_INTRAV3] = MACHINE_AV3_HANDLER, + [VECI_INTRAV4] = MACHINE_AV4_HANDLER, + [VECI_INTRAV5] = MACHINE_AV5_HANDLER, + [VECI_INTRAV6] = MACHINE_AV6_HANDLER, + [VECI_INTRAV7] = MACHINE_AV7_HANDLER, + [VECI_TRAP0] = trap0, /* syscalls */ + [VECI_TRAP1] = TRAP1_HANDLER, /* 1.3 sigreturn */ + [VECI_TRAP2] = trap2, /* trace */ + [VECI_TRAP3] = TRAP3_HANDLER, /* 1.6 sigreturn */ + [VECI_TRAP4] = illinst, + [VECI_TRAP5] = illinst, + [VECI_TRAP6] = illinst, + [VECI_TRAP7] = illinst, + [VECI_TRAP8] = illinst, + [VECI_TRAP9] = illinst, + [VECI_TRAP10] = illinst, + [VECI_TRAP11] = illinst, + [VECI_TRAP12] = trap12, + [VECI_TRAP13] = illinst, + [VECI_TRAP14] = illinst, + [VECI_TRAP15] = trap15, + [VECI_FP_BSUN] = FP_BSUN_HANDLER, + [VECI_FP_INEX] = FP_INEX_HANDLER, + [VECI_FP_DZ] = FP_DZ_HANDLER, + [VECI_FP_UNFL] = FP_UNFL_HANDLER, + [VECI_FP_OPERR] = FP_OPERR_HANDLER, + [VECI_FP_OVFL] = FP_OVFL_HANDLER, + [VECI_FP_SNAN] = FP_SNAN_HANDLER, + [VECI_UNIMP_FP_DATA] = UNIMP_FP_DATA_HANDLER, + [VECI_PMMU_CONF] = badtrap, + [VECI_PMMU_ILLOP] = badtrap, + [VECI_PMMU_ACCESS] = badtrap, + [VECI_rsvd59] = badtrap, + [VECI_UNIMP_EA] = UNIMP_EA_HANDLER, + [VECI_UNIMP_II] = UNIMP_II_HANDLER, + [VECI_rsvd62] = badtrap, + [VECI_rsvd63] = badtrap, + [VECI_USRVEC_START+0] = badtrap, + [VECI_USRVEC_START+1] = badtrap, + [VECI_USRVEC_START+2] = badtrap, + [VECI_USRVEC_START+3] = badtrap, + [VECI_USRVEC_START+4] = badtrap, + [VECI_USRVEC_START+5] = badtrap, + [VECI_USRVEC_START+6] = badtrap, + [VECI_USRVEC_START+7] = badtrap, + [VECI_USRVEC_START+8] = badtrap, + [VECI_USRVEC_START+9] = badtrap, + [VECI_USRVEC_START+10] = badtrap, + [VECI_USRVEC_START+11] = badtrap, + [VECI_USRVEC_START+12] = badtrap, + [VECI_USRVEC_START+13] = badtrap, + [VECI_USRVEC_START+14] = badtrap, + [VECI_USRVEC_START+15] = badtrap, + [VECI_USRVEC_START+16] = badtrap, + [VECI_USRVEC_START+17] = badtrap, + [VECI_USRVEC_START+18] = badtrap, + [VECI_USRVEC_START+19] = badtrap, + [VECI_USRVEC_START+20] = badtrap, + [VECI_USRVEC_START+21] = badtrap, + [VECI_USRVEC_START+22] = badtrap, + [VECI_USRVEC_START+23] = badtrap, + [VECI_USRVEC_START+24] = badtrap, + [VECI_USRVEC_START+25] = badtrap, + [VECI_USRVEC_START+26] = badtrap, + [VECI_USRVEC_START+27] = badtrap, + [VECI_USRVEC_START+28] = badtrap, + [VECI_USRVEC_START+29] = badtrap, + [VECI_USRVEC_START+30] = badtrap, + [VECI_USRVEC_START+31] = badtrap, + [VECI_USRVEC_START+32] = badtrap, + [VECI_USRVEC_START+33] = badtrap, + [VECI_USRVEC_START+34] = badtrap, + [VECI_USRVEC_START+35] = badtrap, + [VECI_USRVEC_START+36] = badtrap, + [VECI_USRVEC_START+37] = badtrap, + [VECI_USRVEC_START+38] = badtrap, + [VECI_USRVEC_START+39] = badtrap, + [VECI_USRVEC_START+40] = badtrap, + [VECI_USRVEC_START+41] = badtrap, + [VECI_USRVEC_START+42] = badtrap, + [VECI_USRVEC_START+43] = badtrap, + [VECI_USRVEC_START+44] = badtrap, + [VECI_USRVEC_START+45] = badtrap, + [VECI_USRVEC_START+46] = badtrap, + [VECI_USRVEC_START+47] = badtrap, + [VECI_USRVEC_START+48] = badtrap, + [VECI_USRVEC_START+49] = badtrap, + [VECI_USRVEC_START+50] = badtrap, + [VECI_USRVEC_START+51] = badtrap, + [VECI_USRVEC_START+52] = badtrap, + [VECI_USRVEC_START+53] = badtrap, + [VECI_USRVEC_START+54] = badtrap, + [VECI_USRVEC_START+55] = badtrap, + [VECI_USRVEC_START+56] = badtrap, + [VECI_USRVEC_START+57] = badtrap, + [VECI_USRVEC_START+58] = badtrap, + [VECI_USRVEC_START+59] = badtrap, + [VECI_USRVEC_START+60] = badtrap, + [VECI_USRVEC_START+61] = badtrap, + [VECI_USRVEC_START+62] = badtrap, + [VECI_USRVEC_START+63] = badtrap, + [VECI_USRVEC_START+64] = badtrap, + [VECI_USRVEC_START+65] = badtrap, + [VECI_USRVEC_START+66] = badtrap, + [VECI_USRVEC_START+67] = badtrap, + [VECI_USRVEC_START+68] = badtrap, + [VECI_USRVEC_START+69] = badtrap, + [VECI_USRVEC_START+70] = badtrap, + [VECI_USRVEC_START+71] = badtrap, + [VECI_USRVEC_START+72] = badtrap, + [VECI_USRVEC_START+73] = badtrap, + [VECI_USRVEC_START+74] = badtrap, + [VECI_USRVEC_START+75] = badtrap, + [VECI_USRVEC_START+76] = badtrap, + [VECI_USRVEC_START+77] = badtrap, + [VECI_USRVEC_START+78] = badtrap, + [VECI_USRVEC_START+79] = badtrap, + [VECI_USRVEC_START+80] = badtrap, + [VECI_USRVEC_START+81] = badtrap, + [VECI_USRVEC_START+82] = badtrap, + [VECI_USRVEC_START+83] = badtrap, + [VECI_USRVEC_START+84] = badtrap, + [VECI_USRVEC_START+85] = badtrap, + [VECI_USRVEC_START+86] = badtrap, + [VECI_USRVEC_START+87] = badtrap, + [VECI_USRVEC_START+88] = badtrap, + [VECI_USRVEC_START+89] = badtrap, + [VECI_USRVEC_START+90] = badtrap, + [VECI_USRVEC_START+91] = badtrap, + [VECI_USRVEC_START+92] = badtrap, + [VECI_USRVEC_START+93] = badtrap, + [VECI_USRVEC_START+94] = badtrap, + [VECI_USRVEC_START+95] = badtrap, + [VECI_USRVEC_START+96] = badtrap, + [VECI_USRVEC_START+97] = badtrap, + [VECI_USRVEC_START+98] = badtrap, + [VECI_USRVEC_START+99] = badtrap, + [VECI_USRVEC_START+100] = badtrap, + [VECI_USRVEC_START+101] = badtrap, + [VECI_USRVEC_START+102] = badtrap, + [VECI_USRVEC_START+103] = badtrap, + [VECI_USRVEC_START+104] = badtrap, + [VECI_USRVEC_START+105] = badtrap, + [VECI_USRVEC_START+106] = badtrap, + [VECI_USRVEC_START+107] = badtrap, + [VECI_USRVEC_START+108] = badtrap, + [VECI_USRVEC_START+109] = badtrap, + [VECI_USRVEC_START+110] = badtrap, + [VECI_USRVEC_START+111] = badtrap, + [VECI_USRVEC_START+112] = badtrap, + [VECI_USRVEC_START+113] = badtrap, + [VECI_USRVEC_START+114] = badtrap, + [VECI_USRVEC_START+115] = badtrap, + [VECI_USRVEC_START+116] = badtrap, + [VECI_USRVEC_START+117] = badtrap, + [VECI_USRVEC_START+118] = badtrap, + [VECI_USRVEC_START+119] = badtrap, + [VECI_USRVEC_START+120] = badtrap, + [VECI_USRVEC_START+121] = badtrap, + [VECI_USRVEC_START+122] = badtrap, + [VECI_USRVEC_START+123] = badtrap, + [VECI_USRVEC_START+124] = badtrap, + [VECI_USRVEC_START+125] = badtrap, + [VECI_USRVEC_START+126] = badtrap, + [VECI_USRVEC_START+127] = badtrap, + [VECI_USRVEC_START+128] = badtrap, + [VECI_USRVEC_START+129] = badtrap, + [VECI_USRVEC_START+130] = badtrap, + [VECI_USRVEC_START+131] = badtrap, + [VECI_USRVEC_START+132] = badtrap, + [VECI_USRVEC_START+133] = badtrap, + [VECI_USRVEC_START+134] = badtrap, + [VECI_USRVEC_START+135] = badtrap, + [VECI_USRVEC_START+136] = badtrap, + [VECI_USRVEC_START+137] = badtrap, + [VECI_USRVEC_START+138] = badtrap, + [VECI_USRVEC_START+139] = badtrap, + [VECI_USRVEC_START+140] = badtrap, + [VECI_USRVEC_START+141] = badtrap, + [VECI_USRVEC_START+142] = badtrap, + [VECI_USRVEC_START+143] = badtrap, + [VECI_USRVEC_START+144] = badtrap, + [VECI_USRVEC_START+145] = badtrap, + [VECI_USRVEC_START+146] = badtrap, + [VECI_USRVEC_START+147] = badtrap, + [VECI_USRVEC_START+148] = badtrap, + [VECI_USRVEC_START+149] = badtrap, + [VECI_USRVEC_START+150] = badtrap, + [VECI_USRVEC_START+151] = badtrap, + [VECI_USRVEC_START+152] = badtrap, + [VECI_USRVEC_START+153] = badtrap, + [VECI_USRVEC_START+154] = badtrap, + [VECI_USRVEC_START+155] = badtrap, + [VECI_USRVEC_START+156] = badtrap, + [VECI_USRVEC_START+157] = badtrap, + [VECI_USRVEC_START+158] = badtrap, + [VECI_USRVEC_START+159] = badtrap, + [VECI_USRVEC_START+160] = badtrap, + [VECI_USRVEC_START+161] = badtrap, + [VECI_USRVEC_START+162] = badtrap, + [VECI_USRVEC_START+163] = badtrap, + [VECI_USRVEC_START+164] = badtrap, + [VECI_USRVEC_START+165] = badtrap, + [VECI_USRVEC_START+166] = badtrap, + [VECI_USRVEC_START+167] = badtrap, + [VECI_USRVEC_START+168] = badtrap, + [VECI_USRVEC_START+169] = badtrap, + [VECI_USRVEC_START+170] = badtrap, + [VECI_USRVEC_START+171] = badtrap, + [VECI_USRVEC_START+172] = badtrap, + [VECI_USRVEC_START+173] = badtrap, + [VECI_USRVEC_START+174] = badtrap, + [VECI_USRVEC_START+175] = badtrap, + [VECI_USRVEC_START+176] = badtrap, + [VECI_USRVEC_START+177] = badtrap, + [VECI_USRVEC_START+178] = badtrap, + [VECI_USRVEC_START+179] = badtrap, + [VECI_USRVEC_START+180] = badtrap, + [VECI_USRVEC_START+181] = badtrap, + [VECI_USRVEC_START+182] = badtrap, + [VECI_USRVEC_START+183] = badtrap, + [VECI_USRVEC_START+184] = badtrap, + [VECI_USRVEC_START+185] = badtrap, + [VECI_USRVEC_START+186] = badtrap, + [VECI_USRVEC_START+187] = badtrap, + [VECI_USRVEC_START+188] = badtrap, + [VECI_USRVEC_START+189] = badtrap, + [VECI_USRVEC_START+190] = badtrap, + [VECI_USRVEC_START+191] = badtrap, +}; + +static void **saved_vbr; + +/* + * vec_init -- + * Initialize the vector table and Vector Base Register. + * + * N.B. We rely on the cputype variable having been initialized + * and the MMU having been enabled. + */ +void +vec_init(void) +{ +#if !defined(__mc68010__) && \ + (defined(NEED_FIXUP_2030) || defined(NEED_FIXUP_40) || \ + defined(NEED_FIXUP_60)) + switch (cputype) { +#ifdef NEED_FIXUP_2030 + case CPU_68020: + case CPU_68030: + vectab[VECI_BUSERR] = busaddrerr2030; + vectab[VECI_ADDRERR] = busaddrerr2030; + break; +#endif /* NEED_FIXUP_2030 */ + +#ifdef NEED_FIXUP_40 + case CPU_68040: + vectab[VECI_BUSERR] = buserr40; + vectab[VECI_ADDRERR] = addrerr4060; + vectab[VECI_FP_BSUN] = FP_BSUN_HANDLER40; + vectab[VECI_FP_INEX] = FP_INEX_HANDLER40; + vectab[VECI_FP_DZ] = FP_DZ_HANDLER40; + vectab[VECI_FP_UNFL] = FP_UNFL_HANDLER40; + vectab[VECI_FP_OPERR] = FP_OPERR_HANDLER40; + vectab[VECI_FP_OVFL] = FP_OVFL_HANDLER40; + vectab[VECI_FP_SNAN] = FP_SNAN_HANDLER40; + DCIS(); + break; +#endif /* NEED_FIXUP_40 */ + +#ifdef NEED_FIXUP_60 + case CPU_68060: + vectab[VECI_BUSERR] = buserr60; + vectab[VECI_ADDRERR] = addrerr4060; + vectab[VECI_FP_INEX] = FP_INEX_HANDLER60; + vectab[VECI_FP_DZ] = FP_DZ_HANDLER60; + vectab[VECI_FP_UNFL] = FP_UNFL_HANDLER60; + vectab[VECI_FP_OPERR] = FP_OPERR_HANDLER60; + vectab[VECI_FP_OVFL] = FP_OVFL_HANDLER60; + vectab[VECI_FP_SNAN] = FP_SNAN_HANDLER60; + vectab[VECI_UNIMP_FP_DATA] = UNIMP_FP_DATA_HANDLER60; + vectab[VECI_UNIMP_EA] = UNIMP_EA_HANDLER60; + vectab[VECI_UNIMP_II] = UNIMP_II_HANDLER60; + DCIS(); + break; +#endif /* NEED_FIXUP_60 */ + default: + panic("vec_init"); + break; + } +#endif + saved_vbr = getvbr(); + setvbr(vectab); +} + +/* + * vec_reset -- + * Reset the Vector Base Register. + */ +void +vec_reset(void) +{ + setvbr(saved_vbr); +}