xref: /netbsd-src/sys/arch/m68k/m68k/vectors.c (revision 91b192d65cc0b267de4ed47c831d6b87feb69839)
1*91b192d6Sthorpej /*	$NetBSD: vectors.c,v 1.3 2024/01/13 20:10:36 thorpej Exp $	*/
2086f7f8fSthorpej 
3086f7f8fSthorpej /*-
4086f7f8fSthorpej  * Copyright (c) 2024 The NetBSD Foundation, Inc.
5086f7f8fSthorpej  * All rights reserved.
6086f7f8fSthorpej  *
7086f7f8fSthorpej  * This code is derived from software contributed to The NetBSD Foundation
8086f7f8fSthorpej  * by Jason R. Thorpe.
9086f7f8fSthorpej  *
10086f7f8fSthorpej  * Redistribution and use in source and binary forms, with or without
11086f7f8fSthorpej  * modification, are permitted provided that the following conditions
12086f7f8fSthorpej  * are met:
13086f7f8fSthorpej  * 1. Redistributions of source code must retain the above copyright
14086f7f8fSthorpej  *    notice, this list of conditions and the following disclaimer.
15086f7f8fSthorpej  * 2. Redistributions in binary form must reproduce the above copyright
16086f7f8fSthorpej  *    notice, this list of conditions and the following disclaimer in the
17086f7f8fSthorpej  *    documentation and/or other materials provided with the distribution.
18086f7f8fSthorpej  *
19086f7f8fSthorpej  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20086f7f8fSthorpej  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21086f7f8fSthorpej  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22086f7f8fSthorpej  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23086f7f8fSthorpej  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24086f7f8fSthorpej  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25086f7f8fSthorpej  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26086f7f8fSthorpej  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27086f7f8fSthorpej  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28086f7f8fSthorpej  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29086f7f8fSthorpej  * POSSIBILITY OF SUCH DAMAGE.
30086f7f8fSthorpej  */
31086f7f8fSthorpej 
3266d7109cSthorpej #ifdef _KERNEL_OPT
3366d7109cSthorpej #include "opt_compat_netbsd.h"
3466d7109cSthorpej #include "opt_compat_sunos.h"
3566d7109cSthorpej #endif
3666d7109cSthorpej 
37086f7f8fSthorpej #include <sys/types.h>
38086f7f8fSthorpej 
39086f7f8fSthorpej #include <machine/cpu.h>
40086f7f8fSthorpej #include <machine/vectors.h>
41086f7f8fSthorpej 
42086f7f8fSthorpej #include <m68k/cacheops.h>
43086f7f8fSthorpej #include <m68k/frame.h>
44086f7f8fSthorpej 
45086f7f8fSthorpej extern char illinst[];
46086f7f8fSthorpej extern char zerodiv[];
47086f7f8fSthorpej extern char chkinst[];
48086f7f8fSthorpej extern char trapvinst[];
49086f7f8fSthorpej extern char privinst[];
50086f7f8fSthorpej extern char trace[];
51086f7f8fSthorpej extern char fpfline[];
52086f7f8fSthorpej extern char badtrap[];
53086f7f8fSthorpej extern char coperr[];
54086f7f8fSthorpej extern char fmterr[];
55086f7f8fSthorpej extern char trap0[];
5666d7109cSthorpej #if defined(COMPAT_13) || defined(COMPAT_SUNOS)
57086f7f8fSthorpej extern char trap1[];
58086f7f8fSthorpej #define	TRAP1_HANDLER		trap1
59086f7f8fSthorpej #else
60086f7f8fSthorpej #define	TRAP1_HANDLER		illinst
6166d7109cSthorpej #endif /* COMPAT_13 || COMPAT_SUNOS */
62086f7f8fSthorpej extern char trap2[];
63086f7f8fSthorpej #ifdef COMPAT_16
64086f7f8fSthorpej extern char trap3[];
65086f7f8fSthorpej #define	TRAP3_HANDLER		trap3
66086f7f8fSthorpej #else
67086f7f8fSthorpej #define	TRAP3_HANDLER		illinst
68086f7f8fSthorpej #endif /* COMPAT_16 */
69086f7f8fSthorpej extern char trap12[];
70086f7f8fSthorpej extern char trap15[];
71086f7f8fSthorpej extern char fpfault[];
72086f7f8fSthorpej extern char fpunsupp[];
73086f7f8fSthorpej 
74086f7f8fSthorpej extern char MACHINE_AV0_HANDLER[];
75086f7f8fSthorpej extern char MACHINE_AV1_HANDLER[];
76086f7f8fSthorpej extern char MACHINE_AV2_HANDLER[];
77086f7f8fSthorpej extern char MACHINE_AV3_HANDLER[];
78086f7f8fSthorpej extern char MACHINE_AV4_HANDLER[];
79086f7f8fSthorpej extern char MACHINE_AV5_HANDLER[];
80086f7f8fSthorpej extern char MACHINE_AV6_HANDLER[];
81086f7f8fSthorpej extern char MACHINE_AV7_HANDLER[];
82086f7f8fSthorpej 
8366d7109cSthorpej #ifdef MACHINE_BUSERR_HANDLER
8466d7109cSthorpej extern char MACHINE_BUSERR_HANDLER[];
8566d7109cSthorpej #endif
8666d7109cSthorpej 
8766d7109cSthorpej #ifdef MACHINE_ADDRERR_HANDLER
8866d7109cSthorpej extern char MACHINE_ADDRERR_HANDLER[];
8966d7109cSthorpej #endif
9066d7109cSthorpej 
9166d7109cSthorpej #ifdef __mc68010__
9266d7109cSthorpej 
9366d7109cSthorpej #define	BUSERR_HANDLER		MACHINE_BUSERR_HANDLER
9466d7109cSthorpej #define	ADDRERR_HANDLER		MACHINE_ADDRERR_HANDLER
9566d7109cSthorpej 
9666d7109cSthorpej #else
97086f7f8fSthorpej 
98086f7f8fSthorpej #if defined(M68020) || defined(M68030)
9966d7109cSthorpej #ifdef MACHINE_BUSERR_HANDLER
10066d7109cSthorpej #define	BUSERR_HANDLER2030	MACHINE_BUSERR_HANDLER
10166d7109cSthorpej #else
10266d7109cSthorpej extern char buserr2030[];
10366d7109cSthorpej #define	BUSERR_HANDLER2030	buserr2030
10466d7109cSthorpej #endif
10566d7109cSthorpej #ifdef MACHINE_ADDRERR_HANDLER
10666d7109cSthorpej #define	ADDRERR_HANDLER2030	MACHINE_ADDRERR_HANDLER
10766d7109cSthorpej #else
10866d7109cSthorpej extern char addrerr2030[];
10966d7109cSthorpej #define	ADDRERR_HANDLER2030	addrerr2030
11066d7109cSthorpej #endif
111086f7f8fSthorpej #if defined(M68040) || defined(M68060)
112086f7f8fSthorpej #define	NEED_FIXUP_2030
113086f7f8fSthorpej #else
11466d7109cSthorpej #define	BUSERR_HANDLER		BUSERR_HANDLER2030
11566d7109cSthorpej #define	ADDRERR_HANDLER		ADDRERR_HANDLER2030
116086f7f8fSthorpej #endif
117086f7f8fSthorpej #endif /* M68020 || M68030 */
118086f7f8fSthorpej 
119086f7f8fSthorpej #if defined(M68040)
120086f7f8fSthorpej extern char buserr40[], addrerr4060[];
121086f7f8fSthorpej #ifdef FPSP
122086f7f8fSthorpej extern char bsun[], inex[], dz[], unfl[], operr[], ovfl[], snan[];
123086f7f8fSthorpej #define	FP_BSUN_HANDLER40	bsun
124086f7f8fSthorpej #define	FP_INEX_HANDLER40	inex
125086f7f8fSthorpej #define	FP_DZ_HANDLER40		dz
126086f7f8fSthorpej #define	FP_UNFL_HANDLER40	unfl
127086f7f8fSthorpej #define	FP_OPERR_HANDLER40	operr
128086f7f8fSthorpej #define	FP_OVFL_HANDLER40	ovfl
129086f7f8fSthorpej #define	FP_SNAN_HANDLER40	snan
130086f7f8fSthorpej #else
131086f7f8fSthorpej #define	FP_BSUN_HANDLER40	fpfault
132086f7f8fSthorpej #define	FP_INEX_HANDLER40	fpfault
133086f7f8fSthorpej #define	FP_DZ_HANDLER40		fpfault
134086f7f8fSthorpej #define	FP_UNFL_HANDLER40	fpfault
135086f7f8fSthorpej #define	FP_OPERR_HANDLER40	fpfault
136086f7f8fSthorpej #define	FP_OVFL_HANDLER40	fpfault
137086f7f8fSthorpej #define	FP_SNAN_HANDLER40	fpfault
138086f7f8fSthorpej #endif
139086f7f8fSthorpej #if defined(M68020) || defined(M68030) || defined(M68060)
140086f7f8fSthorpej #define	NEED_FIXUP_40
141086f7f8fSthorpej #else
142086f7f8fSthorpej #define	BUSERR_HANDLER		buserr40
143086f7f8fSthorpej #define	ADDRERR_HANDLER		addrerr4060
144086f7f8fSthorpej #define	FP_BSUN_HANDLER		FP_BSUN_HANDLER40
145086f7f8fSthorpej #define	FP_INEX_HANDLER		FP_INEX_HANDLER40
146086f7f8fSthorpej #define	FP_DZ_HANDLER		FP_DZ_HANDLER40
147086f7f8fSthorpej #define	FP_UNFL_HANDLER		FP_UNFL_HANDLER40
148086f7f8fSthorpej #define	FP_OPERR_HANDLER	FP_OPERR_HANDLER40
149086f7f8fSthorpej #define	FP_OVFL_HANDLER		FP_OVFL_HANDLER40
150086f7f8fSthorpej #define	FP_SNAN_HANDLER		FP_SNAN_HANDLER40
151086f7f8fSthorpej #endif
152086f7f8fSthorpej #endif /* M68040 */
153086f7f8fSthorpej 
154086f7f8fSthorpej #if defined(M68060)
155086f7f8fSthorpej extern char buserr60[], addrerr4060[];
156086f7f8fSthorpej #ifdef M060SP
157086f7f8fSthorpej extern char FP_CALL_TOP[], I_CALL_TOP[];
158086f7f8fSthorpej #define	LINE111_HANDLER60	&FP_CALL_TOP[128 + 0x30]
159086f7f8fSthorpej #define	FP_INEX_HANDLER60	&FP_CALL_TOP[128 + 0x28]
160086f7f8fSthorpej #define	FP_DZ_HANDLER60		&FP_CALL_TOP[128 + 0x20]
161086f7f8fSthorpej #define	FP_UNFL_HANDLER60	&FP_CALL_TOP[128 + 0x18]
162086f7f8fSthorpej #define	FP_OPERR_HANDLER60	&FP_CALL_TOP[128 + 0x08]
163086f7f8fSthorpej #define	FP_OVFL_HANDLER60	&FP_CALL_TOP[128 + 0x10]
164086f7f8fSthorpej #define	FP_SNAN_HANDLER60	&FP_CALL_TOP[128 + 0x00]
165086f7f8fSthorpej #define	UNIMP_FP_DATA_HANDLER60	&FP_CALL_TOP[128 + 0x38]
166086f7f8fSthorpej #define	UNIMP_EA_HANDLER60	&FP_CALL_TOP[128 + 0x40]
167086f7f8fSthorpej #define	UNIMP_II_HANDLER60	&I_CALL_TOP[128 + 0x00]
168086f7f8fSthorpej #else
169086f7f8fSthorpej #define	LINE111_HANDLER60	fpfline
170086f7f8fSthorpej #define	FP_INEX_HANDLER60	fpfault
171086f7f8fSthorpej #define	FP_DZ_HANDLER60		fpfault
172086f7f8fSthorpej #define	FP_UNFL_HANDLER60	fpfault
173086f7f8fSthorpej #define	FP_OPERR_HANDLER60	fpfault
174086f7f8fSthorpej #define	FP_OVFL_HANDLER60	fpfault
175086f7f8fSthorpej #define	FP_SNAN_HANDLER60	fpfault
176086f7f8fSthorpej #define	UNIMP_FP_DATA_HANDLER60	fpunsupp
177086f7f8fSthorpej #define	UNIMP_EA_HANDLER60	badtrap		/* XXX illinst? */
178086f7f8fSthorpej #define	UNIMP_II_HANDLER60	illinst
179086f7f8fSthorpej #endif
180086f7f8fSthorpej #if defined(M68020) || defined(M68030) || defined(M68040)
181086f7f8fSthorpej #define	NEED_FIXUP_60
182086f7f8fSthorpej #else
183086f7f8fSthorpej #define	BUSERR_HANDLER		buserr60
184086f7f8fSthorpej #define	ADDRERR_HANDLER		addrerr4060
185086f7f8fSthorpej #define	LINE111_HANDLER		LINE111_HANDLER60
186086f7f8fSthorpej #define	FP_INEX_HANDLER		FP_INEX_HANDLER60
187086f7f8fSthorpej #define	FP_DZ_HANDLER		FP_DZ_HANDLER60
188086f7f8fSthorpej #define	FP_UNFL_HANDLER		FP_UNFL_HANDLER60
189086f7f8fSthorpej #define	FP_OPERR_HANDLER	FP_OPERR_HANDLER60
190086f7f8fSthorpej #define	FP_OVFL_HANDLER		FP_OVFL_HANDLER60
191086f7f8fSthorpej #define	FP_SNAN_HANDLER		FP_SNAN_HANDLER60
192086f7f8fSthorpej #define	UNIMP_FP_DATA_HANDLER	UNIMP_FP_DATA_HANDLER60
193086f7f8fSthorpej #define	UNIMP_EA_HANDLER	UNIMP_EA_HANDLER60
194086f7f8fSthorpej #define	UNIMP_II_HANDLER	UNIMP_II_HANDLER60
195086f7f8fSthorpej #endif
196086f7f8fSthorpej #endif /* M68060 */
197086f7f8fSthorpej 
198086f7f8fSthorpej #endif /* __mc68010__ */
199086f7f8fSthorpej 
20066d7109cSthorpej #ifndef MACHINE_RESET_SP
20166d7109cSthorpej #define	MACHINE_RESET_SP	NULL
20266d7109cSthorpej #endif
20366d7109cSthorpej 
20466d7109cSthorpej #ifndef MACHINE_RESET_PC
20566d7109cSthorpej #define	MACHINE_RESET_PC	NULL
20666d7109cSthorpej #endif
20766d7109cSthorpej 
208086f7f8fSthorpej #ifndef BUSERR_HANDLER
209086f7f8fSthorpej #define	BUSERR_HANDLER		badtrap
210086f7f8fSthorpej #endif
211086f7f8fSthorpej 
212086f7f8fSthorpej #ifndef ADDRERR_HANDLER
213086f7f8fSthorpej #define	ADDRERR_HANDLER		badtrap
214086f7f8fSthorpej #endif
215086f7f8fSthorpej 
216086f7f8fSthorpej #ifndef LINE1111_HANDLER
217086f7f8fSthorpej #define	LINE1111_HANDLER	fpfline
218086f7f8fSthorpej #endif
219086f7f8fSthorpej 
220086f7f8fSthorpej #ifndef FP_BSUN_HANDLER
221086f7f8fSthorpej #define	FP_BSUN_HANDLER		fpfault
222086f7f8fSthorpej #endif
223086f7f8fSthorpej 
224086f7f8fSthorpej #ifndef	FP_INEX_HANDLER
225086f7f8fSthorpej #define	FP_INEX_HANDLER		fpfault
226086f7f8fSthorpej #endif
227086f7f8fSthorpej 
228086f7f8fSthorpej #ifndef FP_DZ_HANDLER
229086f7f8fSthorpej #define	FP_DZ_HANDLER		fpfault
230086f7f8fSthorpej #endif
231086f7f8fSthorpej 
232086f7f8fSthorpej #ifndef FP_UNFL_HANDLER
233086f7f8fSthorpej #define	FP_UNFL_HANDLER		fpfault
234086f7f8fSthorpej #endif
235086f7f8fSthorpej 
236086f7f8fSthorpej #ifndef FP_OPERR_HANDLER
237086f7f8fSthorpej #define	FP_OPERR_HANDLER	fpfault
238086f7f8fSthorpej #endif
239086f7f8fSthorpej 
240086f7f8fSthorpej #ifndef FP_OVFL_HANDLER
241086f7f8fSthorpej #define	FP_OVFL_HANDLER		fpfault
242086f7f8fSthorpej #endif
243086f7f8fSthorpej 
244086f7f8fSthorpej #ifndef FP_SNAN_HANDLER
245086f7f8fSthorpej #define	FP_SNAN_HANDLER		fpfault
246086f7f8fSthorpej #endif
247086f7f8fSthorpej 
248086f7f8fSthorpej #ifndef UNIMP_FP_DATA_HANDLER
249086f7f8fSthorpej #define	UNIMP_FP_DATA_HANDLER	fpunsupp
250086f7f8fSthorpej #endif
251086f7f8fSthorpej 
252086f7f8fSthorpej #ifndef UNIMP_EA_HANDLER
253086f7f8fSthorpej #define	UNIMP_EA_HANDLER	badtrap
254086f7f8fSthorpej #endif
255086f7f8fSthorpej 
256086f7f8fSthorpej #ifndef UNIMP_II_HANDLER
257086f7f8fSthorpej #define	UNIMP_II_HANDLER	badtrap
258086f7f8fSthorpej #endif
259086f7f8fSthorpej 
260086f7f8fSthorpej void *vectab[NVECTORS] = {
26166d7109cSthorpej 	[VECI_RIISP]		=	MACHINE_RESET_SP,
26266d7109cSthorpej 	[VECI_RIPC]		=	MACHINE_RESET_PC,
263086f7f8fSthorpej 	[VECI_BUSERR]		=	BUSERR_HANDLER,
264086f7f8fSthorpej 	[VECI_ADDRERR]		=	ADDRERR_HANDLER,
265086f7f8fSthorpej 	[VECI_ILLINST]		=	illinst,
266086f7f8fSthorpej 	[VECI_ZERODIV]		=	zerodiv,
267086f7f8fSthorpej 	[VECI_CHK]		=	chkinst,
268086f7f8fSthorpej 	[VECI_TRAPcc]		=	trapvinst,
269086f7f8fSthorpej 	[VECI_PRIV]		=	privinst,
270086f7f8fSthorpej 	[VECI_TRACE]		=	trace,
271086f7f8fSthorpej 	[VECI_LINE1010]		=	illinst,
272086f7f8fSthorpej 	[VECI_LINE1111]		=	LINE1111_HANDLER,
273086f7f8fSthorpej 	[VECI_rsvd12]		=	badtrap,
274086f7f8fSthorpej 	[VECI_CPV]		=	coperr,
275086f7f8fSthorpej 	[VECI_FORMATERR]	=	fmterr,
276086f7f8fSthorpej 	[VECI_UNINT_INTR]	=	badtrap,
277086f7f8fSthorpej 	[VECI_rsvd16]		=	badtrap,
278086f7f8fSthorpej 	[VECI_rsvd17]		=	badtrap,
279086f7f8fSthorpej 	[VECI_rsvd18]		=	badtrap,
280086f7f8fSthorpej 	[VECI_rsvd19]		=	badtrap,
281086f7f8fSthorpej 	[VECI_rsvd20]		=	badtrap,
282086f7f8fSthorpej 	[VECI_rsvd21]		=	badtrap,
283086f7f8fSthorpej 	[VECI_rsvd22]		=	badtrap,
284086f7f8fSthorpej 	[VECI_rsvd23]		=	badtrap,
28566d7109cSthorpej 	[VECI_INTRAV0]		=	MACHINE_AV0_HANDLER,
286086f7f8fSthorpej 	[VECI_INTRAV1]		=	MACHINE_AV1_HANDLER,
287086f7f8fSthorpej 	[VECI_INTRAV2]		=	MACHINE_AV2_HANDLER,
288086f7f8fSthorpej 	[VECI_INTRAV3]		=	MACHINE_AV3_HANDLER,
289086f7f8fSthorpej 	[VECI_INTRAV4]		=	MACHINE_AV4_HANDLER,
290086f7f8fSthorpej 	[VECI_INTRAV5]		=	MACHINE_AV5_HANDLER,
291086f7f8fSthorpej 	[VECI_INTRAV6]		=	MACHINE_AV6_HANDLER,
292086f7f8fSthorpej 	[VECI_INTRAV7]		=	MACHINE_AV7_HANDLER,
293086f7f8fSthorpej 	[VECI_TRAP0]		=	trap0,		/* syscalls */
294086f7f8fSthorpej 	[VECI_TRAP1]		=	TRAP1_HANDLER,	/* 1.3 sigreturn */
295086f7f8fSthorpej 	[VECI_TRAP2]		=	trap2,		/* trace */
296086f7f8fSthorpej 	[VECI_TRAP3]		=	TRAP3_HANDLER,	/* 1.6 sigreturn */
297086f7f8fSthorpej 	[VECI_TRAP4]		=	illinst,
298086f7f8fSthorpej 	[VECI_TRAP5]		=	illinst,
299086f7f8fSthorpej 	[VECI_TRAP6]		=	illinst,
300086f7f8fSthorpej 	[VECI_TRAP7]		=	illinst,
301086f7f8fSthorpej 	[VECI_TRAP8]		=	illinst,
302086f7f8fSthorpej 	[VECI_TRAP9]		=	illinst,
303086f7f8fSthorpej 	[VECI_TRAP10]		=	illinst,
304086f7f8fSthorpej 	[VECI_TRAP11]		=	illinst,
305086f7f8fSthorpej 	[VECI_TRAP12]		=	trap12,
306086f7f8fSthorpej 	[VECI_TRAP13]		=	illinst,
307086f7f8fSthorpej 	[VECI_TRAP14]		=	illinst,
308086f7f8fSthorpej 	[VECI_TRAP15]		=	trap15,
309086f7f8fSthorpej 	[VECI_FP_BSUN]		=	FP_BSUN_HANDLER,
310086f7f8fSthorpej 	[VECI_FP_INEX]		=	FP_INEX_HANDLER,
311086f7f8fSthorpej 	[VECI_FP_DZ]		=	FP_DZ_HANDLER,
312086f7f8fSthorpej 	[VECI_FP_UNFL]		=	FP_UNFL_HANDLER,
313086f7f8fSthorpej 	[VECI_FP_OPERR]		=	FP_OPERR_HANDLER,
314086f7f8fSthorpej 	[VECI_FP_OVFL]		=	FP_OVFL_HANDLER,
315086f7f8fSthorpej 	[VECI_FP_SNAN]		=	FP_SNAN_HANDLER,
316086f7f8fSthorpej 	[VECI_UNIMP_FP_DATA]	=	UNIMP_FP_DATA_HANDLER,
317086f7f8fSthorpej 	[VECI_PMMU_CONF]	=	badtrap,
318086f7f8fSthorpej 	[VECI_PMMU_ILLOP]	=	badtrap,
319086f7f8fSthorpej 	[VECI_PMMU_ACCESS]	=	badtrap,
320086f7f8fSthorpej 	[VECI_rsvd59]		=	badtrap,
321086f7f8fSthorpej 	[VECI_UNIMP_EA]		=	UNIMP_EA_HANDLER,
322086f7f8fSthorpej 	[VECI_UNIMP_II]		=	UNIMP_II_HANDLER,
323086f7f8fSthorpej 	[VECI_rsvd62]		=	badtrap,
324086f7f8fSthorpej 	[VECI_rsvd63]		=	badtrap,
325086f7f8fSthorpej 	[VECI_USRVEC_START+0]	=	badtrap,
326086f7f8fSthorpej 	[VECI_USRVEC_START+1]	=	badtrap,
327086f7f8fSthorpej 	[VECI_USRVEC_START+2]	=	badtrap,
328086f7f8fSthorpej 	[VECI_USRVEC_START+3]	=	badtrap,
329086f7f8fSthorpej 	[VECI_USRVEC_START+4]	=	badtrap,
330086f7f8fSthorpej 	[VECI_USRVEC_START+5]	=	badtrap,
331086f7f8fSthorpej 	[VECI_USRVEC_START+6]	=	badtrap,
332086f7f8fSthorpej 	[VECI_USRVEC_START+7]	=	badtrap,
333086f7f8fSthorpej 	[VECI_USRVEC_START+8]	=	badtrap,
334086f7f8fSthorpej 	[VECI_USRVEC_START+9]	=	badtrap,
335086f7f8fSthorpej 	[VECI_USRVEC_START+10]	=	badtrap,
336086f7f8fSthorpej 	[VECI_USRVEC_START+11]	=	badtrap,
337086f7f8fSthorpej 	[VECI_USRVEC_START+12]	=	badtrap,
338086f7f8fSthorpej 	[VECI_USRVEC_START+13]	=	badtrap,
339086f7f8fSthorpej 	[VECI_USRVEC_START+14]	=	badtrap,
340086f7f8fSthorpej 	[VECI_USRVEC_START+15]	=	badtrap,
341086f7f8fSthorpej 	[VECI_USRVEC_START+16]	=	badtrap,
342086f7f8fSthorpej 	[VECI_USRVEC_START+17]	=	badtrap,
343086f7f8fSthorpej 	[VECI_USRVEC_START+18]	=	badtrap,
344086f7f8fSthorpej 	[VECI_USRVEC_START+19]	=	badtrap,
345086f7f8fSthorpej 	[VECI_USRVEC_START+20]	=	badtrap,
346086f7f8fSthorpej 	[VECI_USRVEC_START+21]	=	badtrap,
347086f7f8fSthorpej 	[VECI_USRVEC_START+22]	=	badtrap,
348086f7f8fSthorpej 	[VECI_USRVEC_START+23]	=	badtrap,
349086f7f8fSthorpej 	[VECI_USRVEC_START+24]	=	badtrap,
350086f7f8fSthorpej 	[VECI_USRVEC_START+25]	=	badtrap,
351086f7f8fSthorpej 	[VECI_USRVEC_START+26]	=	badtrap,
352086f7f8fSthorpej 	[VECI_USRVEC_START+27]	=	badtrap,
353086f7f8fSthorpej 	[VECI_USRVEC_START+28]	=	badtrap,
354086f7f8fSthorpej 	[VECI_USRVEC_START+29]	=	badtrap,
355086f7f8fSthorpej 	[VECI_USRVEC_START+30]	=	badtrap,
356086f7f8fSthorpej 	[VECI_USRVEC_START+31]	=	badtrap,
357086f7f8fSthorpej 	[VECI_USRVEC_START+32]	=	badtrap,
358086f7f8fSthorpej 	[VECI_USRVEC_START+33]	=	badtrap,
359086f7f8fSthorpej 	[VECI_USRVEC_START+34]	=	badtrap,
360086f7f8fSthorpej 	[VECI_USRVEC_START+35]	=	badtrap,
361086f7f8fSthorpej 	[VECI_USRVEC_START+36]	=	badtrap,
362086f7f8fSthorpej 	[VECI_USRVEC_START+37]	=	badtrap,
363086f7f8fSthorpej 	[VECI_USRVEC_START+38]	=	badtrap,
364086f7f8fSthorpej 	[VECI_USRVEC_START+39]	=	badtrap,
365086f7f8fSthorpej 	[VECI_USRVEC_START+40]	=	badtrap,
366086f7f8fSthorpej 	[VECI_USRVEC_START+41]	=	badtrap,
367086f7f8fSthorpej 	[VECI_USRVEC_START+42]	=	badtrap,
368086f7f8fSthorpej 	[VECI_USRVEC_START+43]	=	badtrap,
369086f7f8fSthorpej 	[VECI_USRVEC_START+44]	=	badtrap,
370086f7f8fSthorpej 	[VECI_USRVEC_START+45]	=	badtrap,
371086f7f8fSthorpej 	[VECI_USRVEC_START+46]	=	badtrap,
372086f7f8fSthorpej 	[VECI_USRVEC_START+47]	=	badtrap,
373086f7f8fSthorpej 	[VECI_USRVEC_START+48]	=	badtrap,
374086f7f8fSthorpej 	[VECI_USRVEC_START+49]	=	badtrap,
375086f7f8fSthorpej 	[VECI_USRVEC_START+50]	=	badtrap,
376086f7f8fSthorpej 	[VECI_USRVEC_START+51]	=	badtrap,
377086f7f8fSthorpej 	[VECI_USRVEC_START+52]	=	badtrap,
378086f7f8fSthorpej 	[VECI_USRVEC_START+53]	=	badtrap,
379086f7f8fSthorpej 	[VECI_USRVEC_START+54]	=	badtrap,
380086f7f8fSthorpej 	[VECI_USRVEC_START+55]	=	badtrap,
381086f7f8fSthorpej 	[VECI_USRVEC_START+56]	=	badtrap,
382086f7f8fSthorpej 	[VECI_USRVEC_START+57]	=	badtrap,
383086f7f8fSthorpej 	[VECI_USRVEC_START+58]	=	badtrap,
384086f7f8fSthorpej 	[VECI_USRVEC_START+59]	=	badtrap,
385086f7f8fSthorpej 	[VECI_USRVEC_START+60]	=	badtrap,
386086f7f8fSthorpej 	[VECI_USRVEC_START+61]	=	badtrap,
387086f7f8fSthorpej 	[VECI_USRVEC_START+62]	=	badtrap,
388086f7f8fSthorpej 	[VECI_USRVEC_START+63]	=	badtrap,
389086f7f8fSthorpej 	[VECI_USRVEC_START+64]	=	badtrap,
390086f7f8fSthorpej 	[VECI_USRVEC_START+65]	=	badtrap,
391086f7f8fSthorpej 	[VECI_USRVEC_START+66]	=	badtrap,
392086f7f8fSthorpej 	[VECI_USRVEC_START+67]	=	badtrap,
393086f7f8fSthorpej 	[VECI_USRVEC_START+68]	=	badtrap,
394086f7f8fSthorpej 	[VECI_USRVEC_START+69]	=	badtrap,
395086f7f8fSthorpej 	[VECI_USRVEC_START+70]	=	badtrap,
396086f7f8fSthorpej 	[VECI_USRVEC_START+71]	=	badtrap,
397086f7f8fSthorpej 	[VECI_USRVEC_START+72]	=	badtrap,
398086f7f8fSthorpej 	[VECI_USRVEC_START+73]	=	badtrap,
399086f7f8fSthorpej 	[VECI_USRVEC_START+74]	=	badtrap,
400086f7f8fSthorpej 	[VECI_USRVEC_START+75]	=	badtrap,
401086f7f8fSthorpej 	[VECI_USRVEC_START+76]	=	badtrap,
402086f7f8fSthorpej 	[VECI_USRVEC_START+77]	=	badtrap,
403086f7f8fSthorpej 	[VECI_USRVEC_START+78]	=	badtrap,
404086f7f8fSthorpej 	[VECI_USRVEC_START+79]	=	badtrap,
405086f7f8fSthorpej 	[VECI_USRVEC_START+80]	=	badtrap,
406086f7f8fSthorpej 	[VECI_USRVEC_START+81]	=	badtrap,
407086f7f8fSthorpej 	[VECI_USRVEC_START+82]	=	badtrap,
408086f7f8fSthorpej 	[VECI_USRVEC_START+83]	=	badtrap,
409086f7f8fSthorpej 	[VECI_USRVEC_START+84]	=	badtrap,
410086f7f8fSthorpej 	[VECI_USRVEC_START+85]	=	badtrap,
411086f7f8fSthorpej 	[VECI_USRVEC_START+86]	=	badtrap,
412086f7f8fSthorpej 	[VECI_USRVEC_START+87]	=	badtrap,
413086f7f8fSthorpej 	[VECI_USRVEC_START+88]	=	badtrap,
414086f7f8fSthorpej 	[VECI_USRVEC_START+89]	=	badtrap,
415086f7f8fSthorpej 	[VECI_USRVEC_START+90]	=	badtrap,
416086f7f8fSthorpej 	[VECI_USRVEC_START+91]	=	badtrap,
417086f7f8fSthorpej 	[VECI_USRVEC_START+92]	=	badtrap,
418086f7f8fSthorpej 	[VECI_USRVEC_START+93]	=	badtrap,
419086f7f8fSthorpej 	[VECI_USRVEC_START+94]	=	badtrap,
420086f7f8fSthorpej 	[VECI_USRVEC_START+95]	=	badtrap,
421086f7f8fSthorpej 	[VECI_USRVEC_START+96]	=	badtrap,
422086f7f8fSthorpej 	[VECI_USRVEC_START+97]	=	badtrap,
423086f7f8fSthorpej 	[VECI_USRVEC_START+98]	=	badtrap,
424086f7f8fSthorpej 	[VECI_USRVEC_START+99]	=	badtrap,
425086f7f8fSthorpej 	[VECI_USRVEC_START+100]	=	badtrap,
426086f7f8fSthorpej 	[VECI_USRVEC_START+101]	=	badtrap,
427086f7f8fSthorpej 	[VECI_USRVEC_START+102]	=	badtrap,
428086f7f8fSthorpej 	[VECI_USRVEC_START+103]	=	badtrap,
429086f7f8fSthorpej 	[VECI_USRVEC_START+104]	=	badtrap,
430086f7f8fSthorpej 	[VECI_USRVEC_START+105]	=	badtrap,
431086f7f8fSthorpej 	[VECI_USRVEC_START+106]	=	badtrap,
432086f7f8fSthorpej 	[VECI_USRVEC_START+107]	=	badtrap,
433086f7f8fSthorpej 	[VECI_USRVEC_START+108]	=	badtrap,
434086f7f8fSthorpej 	[VECI_USRVEC_START+109]	=	badtrap,
435086f7f8fSthorpej 	[VECI_USRVEC_START+110]	=	badtrap,
436086f7f8fSthorpej 	[VECI_USRVEC_START+111]	=	badtrap,
437086f7f8fSthorpej 	[VECI_USRVEC_START+112]	=	badtrap,
438086f7f8fSthorpej 	[VECI_USRVEC_START+113]	=	badtrap,
439086f7f8fSthorpej 	[VECI_USRVEC_START+114]	=	badtrap,
440086f7f8fSthorpej 	[VECI_USRVEC_START+115]	=	badtrap,
441086f7f8fSthorpej 	[VECI_USRVEC_START+116]	=	badtrap,
442086f7f8fSthorpej 	[VECI_USRVEC_START+117]	=	badtrap,
443086f7f8fSthorpej 	[VECI_USRVEC_START+118]	=	badtrap,
444086f7f8fSthorpej 	[VECI_USRVEC_START+119]	=	badtrap,
445086f7f8fSthorpej 	[VECI_USRVEC_START+120]	=	badtrap,
446086f7f8fSthorpej 	[VECI_USRVEC_START+121]	=	badtrap,
447086f7f8fSthorpej 	[VECI_USRVEC_START+122]	=	badtrap,
448086f7f8fSthorpej 	[VECI_USRVEC_START+123]	=	badtrap,
449086f7f8fSthorpej 	[VECI_USRVEC_START+124]	=	badtrap,
450086f7f8fSthorpej 	[VECI_USRVEC_START+125]	=	badtrap,
451086f7f8fSthorpej 	[VECI_USRVEC_START+126]	=	badtrap,
452086f7f8fSthorpej 	[VECI_USRVEC_START+127]	=	badtrap,
453086f7f8fSthorpej 	[VECI_USRVEC_START+128]	=	badtrap,
454086f7f8fSthorpej 	[VECI_USRVEC_START+129]	=	badtrap,
455086f7f8fSthorpej 	[VECI_USRVEC_START+130]	=	badtrap,
456086f7f8fSthorpej 	[VECI_USRVEC_START+131]	=	badtrap,
457086f7f8fSthorpej 	[VECI_USRVEC_START+132]	=	badtrap,
458086f7f8fSthorpej 	[VECI_USRVEC_START+133]	=	badtrap,
459086f7f8fSthorpej 	[VECI_USRVEC_START+134]	=	badtrap,
460086f7f8fSthorpej 	[VECI_USRVEC_START+135]	=	badtrap,
461086f7f8fSthorpej 	[VECI_USRVEC_START+136]	=	badtrap,
462086f7f8fSthorpej 	[VECI_USRVEC_START+137]	=	badtrap,
463086f7f8fSthorpej 	[VECI_USRVEC_START+138]	=	badtrap,
464086f7f8fSthorpej 	[VECI_USRVEC_START+139]	=	badtrap,
465086f7f8fSthorpej 	[VECI_USRVEC_START+140]	=	badtrap,
466086f7f8fSthorpej 	[VECI_USRVEC_START+141]	=	badtrap,
467086f7f8fSthorpej 	[VECI_USRVEC_START+142]	=	badtrap,
468086f7f8fSthorpej 	[VECI_USRVEC_START+143]	=	badtrap,
469086f7f8fSthorpej 	[VECI_USRVEC_START+144]	=	badtrap,
470086f7f8fSthorpej 	[VECI_USRVEC_START+145]	=	badtrap,
471086f7f8fSthorpej 	[VECI_USRVEC_START+146]	=	badtrap,
472086f7f8fSthorpej 	[VECI_USRVEC_START+147]	=	badtrap,
473086f7f8fSthorpej 	[VECI_USRVEC_START+148]	=	badtrap,
474086f7f8fSthorpej 	[VECI_USRVEC_START+149]	=	badtrap,
475086f7f8fSthorpej 	[VECI_USRVEC_START+150]	=	badtrap,
476086f7f8fSthorpej 	[VECI_USRVEC_START+151]	=	badtrap,
477086f7f8fSthorpej 	[VECI_USRVEC_START+152]	=	badtrap,
478086f7f8fSthorpej 	[VECI_USRVEC_START+153]	=	badtrap,
479086f7f8fSthorpej 	[VECI_USRVEC_START+154]	=	badtrap,
480086f7f8fSthorpej 	[VECI_USRVEC_START+155]	=	badtrap,
481086f7f8fSthorpej 	[VECI_USRVEC_START+156]	=	badtrap,
482086f7f8fSthorpej 	[VECI_USRVEC_START+157]	=	badtrap,
483086f7f8fSthorpej 	[VECI_USRVEC_START+158]	=	badtrap,
484086f7f8fSthorpej 	[VECI_USRVEC_START+159]	=	badtrap,
485086f7f8fSthorpej 	[VECI_USRVEC_START+160]	=	badtrap,
486086f7f8fSthorpej 	[VECI_USRVEC_START+161]	=	badtrap,
487086f7f8fSthorpej 	[VECI_USRVEC_START+162]	=	badtrap,
488086f7f8fSthorpej 	[VECI_USRVEC_START+163]	=	badtrap,
489086f7f8fSthorpej 	[VECI_USRVEC_START+164]	=	badtrap,
490086f7f8fSthorpej 	[VECI_USRVEC_START+165]	=	badtrap,
491086f7f8fSthorpej 	[VECI_USRVEC_START+166]	=	badtrap,
492086f7f8fSthorpej 	[VECI_USRVEC_START+167]	=	badtrap,
493086f7f8fSthorpej 	[VECI_USRVEC_START+168]	=	badtrap,
494086f7f8fSthorpej 	[VECI_USRVEC_START+169]	=	badtrap,
495086f7f8fSthorpej 	[VECI_USRVEC_START+170]	=	badtrap,
496086f7f8fSthorpej 	[VECI_USRVEC_START+171]	=	badtrap,
497086f7f8fSthorpej 	[VECI_USRVEC_START+172]	=	badtrap,
498086f7f8fSthorpej 	[VECI_USRVEC_START+173]	=	badtrap,
499086f7f8fSthorpej 	[VECI_USRVEC_START+174]	=	badtrap,
500086f7f8fSthorpej 	[VECI_USRVEC_START+175]	=	badtrap,
501086f7f8fSthorpej 	[VECI_USRVEC_START+176]	=	badtrap,
502086f7f8fSthorpej 	[VECI_USRVEC_START+177]	=	badtrap,
503086f7f8fSthorpej 	[VECI_USRVEC_START+178]	=	badtrap,
504086f7f8fSthorpej 	[VECI_USRVEC_START+179]	=	badtrap,
505086f7f8fSthorpej 	[VECI_USRVEC_START+180]	=	badtrap,
506086f7f8fSthorpej 	[VECI_USRVEC_START+181]	=	badtrap,
507086f7f8fSthorpej 	[VECI_USRVEC_START+182]	=	badtrap,
508086f7f8fSthorpej 	[VECI_USRVEC_START+183]	=	badtrap,
509086f7f8fSthorpej 	[VECI_USRVEC_START+184]	=	badtrap,
510086f7f8fSthorpej 	[VECI_USRVEC_START+185]	=	badtrap,
511086f7f8fSthorpej 	[VECI_USRVEC_START+186]	=	badtrap,
512086f7f8fSthorpej 	[VECI_USRVEC_START+187]	=	badtrap,
513086f7f8fSthorpej 	[VECI_USRVEC_START+188]	=	badtrap,
514086f7f8fSthorpej 	[VECI_USRVEC_START+189]	=	badtrap,
515086f7f8fSthorpej 	[VECI_USRVEC_START+190]	=	badtrap,
516086f7f8fSthorpej 	[VECI_USRVEC_START+191]	=	badtrap,
517086f7f8fSthorpej };
518086f7f8fSthorpej 
519*91b192d6Sthorpej void **saved_vbr;
520086f7f8fSthorpej 
521086f7f8fSthorpej /*
522086f7f8fSthorpej  * vec_init --
523086f7f8fSthorpej  *	Initialize the vector table and Vector Base Register.
524086f7f8fSthorpej  *
525086f7f8fSthorpej  *	N.B. We rely on the cputype variable having been initialized
526086f7f8fSthorpej  *	and the MMU having been enabled.
527086f7f8fSthorpej  */
528086f7f8fSthorpej void
vec_init(void)529086f7f8fSthorpej vec_init(void)
530086f7f8fSthorpej {
531086f7f8fSthorpej #if !defined(__mc68010__) && \
532086f7f8fSthorpej     (defined(NEED_FIXUP_2030) || defined(NEED_FIXUP_40) || \
533086f7f8fSthorpej      defined(NEED_FIXUP_60))
534086f7f8fSthorpej 	switch (cputype) {
535086f7f8fSthorpej #ifdef NEED_FIXUP_2030
536086f7f8fSthorpej 	case CPU_68020:
537086f7f8fSthorpej 	case CPU_68030:
53866d7109cSthorpej 		vectab[VECI_BUSERR]        = BUSERR_HANDLER2030;
53966d7109cSthorpej 		vectab[VECI_ADDRERR]       = ADDRERR_HANDLER2030;
540086f7f8fSthorpej 		break;
541086f7f8fSthorpej #endif /* NEED_FIXUP_2030 */
542086f7f8fSthorpej 
543086f7f8fSthorpej #ifdef NEED_FIXUP_40
544086f7f8fSthorpej 	case CPU_68040:
545086f7f8fSthorpej 		vectab[VECI_BUSERR]        = buserr40;
546086f7f8fSthorpej 		vectab[VECI_ADDRERR]       = addrerr4060;
547086f7f8fSthorpej 		vectab[VECI_FP_BSUN]       = FP_BSUN_HANDLER40;
548086f7f8fSthorpej 		vectab[VECI_FP_INEX]       = FP_INEX_HANDLER40;
549086f7f8fSthorpej 		vectab[VECI_FP_DZ]         = FP_DZ_HANDLER40;
550086f7f8fSthorpej 		vectab[VECI_FP_UNFL]       = FP_UNFL_HANDLER40;
551086f7f8fSthorpej 		vectab[VECI_FP_OPERR]      = FP_OPERR_HANDLER40;
552086f7f8fSthorpej 		vectab[VECI_FP_OVFL]       = FP_OVFL_HANDLER40;
553086f7f8fSthorpej 		vectab[VECI_FP_SNAN]       = FP_SNAN_HANDLER40;
554086f7f8fSthorpej 		DCIS();
555086f7f8fSthorpej 		break;
556086f7f8fSthorpej #endif /* NEED_FIXUP_40 */
557086f7f8fSthorpej 
558086f7f8fSthorpej #ifdef NEED_FIXUP_60
559086f7f8fSthorpej 	case CPU_68060:
560086f7f8fSthorpej 		vectab[VECI_BUSERR]        = buserr60;
561086f7f8fSthorpej 		vectab[VECI_ADDRERR]       = addrerr4060;
562086f7f8fSthorpej 		vectab[VECI_FP_INEX]       = FP_INEX_HANDLER60;
563086f7f8fSthorpej 		vectab[VECI_FP_DZ]         = FP_DZ_HANDLER60;
564086f7f8fSthorpej 		vectab[VECI_FP_UNFL]       = FP_UNFL_HANDLER60;
565086f7f8fSthorpej 		vectab[VECI_FP_OPERR]      = FP_OPERR_HANDLER60;
566086f7f8fSthorpej 		vectab[VECI_FP_OVFL]       = FP_OVFL_HANDLER60;
567086f7f8fSthorpej 		vectab[VECI_FP_SNAN]       = FP_SNAN_HANDLER60;
568086f7f8fSthorpej 		vectab[VECI_UNIMP_FP_DATA] = UNIMP_FP_DATA_HANDLER60;
569086f7f8fSthorpej 		vectab[VECI_UNIMP_EA]      = UNIMP_EA_HANDLER60;
570086f7f8fSthorpej 		vectab[VECI_UNIMP_II]      = UNIMP_II_HANDLER60;
571086f7f8fSthorpej 		DCIS();
572086f7f8fSthorpej 		break;
573086f7f8fSthorpej #endif /* NEED_FIXUP_60 */
574086f7f8fSthorpej 	default:
575086f7f8fSthorpej 		panic("vec_init");
576086f7f8fSthorpej 		break;
577086f7f8fSthorpej 	}
578086f7f8fSthorpej #endif
579086f7f8fSthorpej 	saved_vbr = getvbr();
580086f7f8fSthorpej 	setvbr(vectab);
581086f7f8fSthorpej }
582086f7f8fSthorpej 
583086f7f8fSthorpej /*
584086f7f8fSthorpej  * vec_reset --
585086f7f8fSthorpej  *	Reset the Vector Base Register.
586086f7f8fSthorpej  */
587086f7f8fSthorpej void
vec_reset(void)588086f7f8fSthorpej vec_reset(void)
589086f7f8fSthorpej {
590086f7f8fSthorpej 	setvbr(saved_vbr);
591086f7f8fSthorpej }
59266d7109cSthorpej 
59366d7109cSthorpej /*
59466d7109cSthorpej  * vec_get_entry --
59566d7109cSthorpej  *	Get a vector table entry.
59666d7109cSthorpej  */
59766d7109cSthorpej void *
vec_get_entry(int vec)59866d7109cSthorpej vec_get_entry(int vec)
59966d7109cSthorpej {
60066d7109cSthorpej 	KASSERT(vec >= 0);
60166d7109cSthorpej 	KASSERT(vec < NVECTORS);
60266d7109cSthorpej 	return vectab[vec];
60366d7109cSthorpej }
60466d7109cSthorpej 
60566d7109cSthorpej /*
60666d7109cSthorpej  * vec_set_entry --
60766d7109cSthorpej  *	Set a vector table entry.
60866d7109cSthorpej  */
60966d7109cSthorpej void
vec_set_entry(int vec,void * addr)61066d7109cSthorpej vec_set_entry(int vec, void *addr)
61166d7109cSthorpej {
61266d7109cSthorpej 	KASSERT(vec >= 0);
61366d7109cSthorpej 	KASSERT(vec < NVECTORS);
61466d7109cSthorpej 	vectab[vec] = addr;
61566d7109cSthorpej #if defined(M68040) || defined(M68060)
61666d7109cSthorpej 	if (cputype == CPU_68040 || cputype == CPU_68060) {
61766d7109cSthorpej 		DCIS();
61866d7109cSthorpej 	}
61966d7109cSthorpej #endif
62066d7109cSthorpej }
621