#ifdef _KERNEL_OPT
#include "opt_compat_netbsd.h"
#include "opt_compat_sunos.h"
#include "opt_fpsp.h"
#include "opt_m060sp.h"
#include "opt_m68k_arch.h"
#endif
#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 fmterr[];
extern char trap0[];
#if defined(COMPAT_13) || defined(COMPAT_SUNOS)
extern char trap1[];
#define TRAP1_HANDLER trap1
#else
#define TRAP1_HANDLER illinst
#endif
extern char trap2[];
#ifdef COMPAT_16
extern char trap3[];
#define TRAP3_HANDLER trap3
#else
#define TRAP3_HANDLER illinst
#endif
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[];
#ifdef __mc68010__
extern char buserr10[];
#define BUSERR_HANDLER buserr10
extern char addrerr10[];
#define ADDRERR_HANDLER addrerr10
#else
extern char coperr[];
#define CPV_HANDLER coperr
#if defined(M68020) || defined(M68030)
extern char buserr2030[];
extern char addrerr2030[];
#if defined(M68040) || defined(M68060) || defined(__HAVE_M68K_PRIVATE_VECTAB)
#define NEED_FIXUP_2030
#else
#define BUSERR_HANDLER buserr2030
#define ADDRERR_HANDLER addrerr2030
#endif
#endif
#if defined(M68040)
extern char buserr40[], addrerr4060[];
#ifdef FPSP
extern char fpfline_fpsp40[], fpunsupp_fpsp40[];
extern char bsun[], inex[], dz[], unfl[], operr[], ovfl[], snan[];
#define LINE1111_HANDLER40 fpfline_fpsp40
#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
#define UNIMP_FP_DATA_HANDLER40 fpunsupp_fpsp40
#else
extern char fpunsupp_4060[];
#define LINE1111_HANDLER40 fpfline
#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
#define UNIMP_FP_DATA_HANDLER40 fpunsupp_4060
#endif
#if defined(M68020) || defined(M68030) || defined(M68060) || \
defined(__HAVE_M68K_PRIVATE_VECTAB)
#define NEED_FIXUP_40
#else
#define BUSERR_HANDLER buserr40
#define ADDRERR_HANDLER addrerr4060
#endif
#endif
#if defined(M68060)
extern char buserr60[], addrerr4060[];
#ifdef M060SP
extern char FP_CALL_TOP[], I_CALL_TOP[];
#define LINE1111_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 LINE1111_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_4060
#define UNIMP_EA_HANDLER60 illinst
#define UNIMP_II_HANDLER60 illinst
#endif
#if defined(M68020) || defined(M68030) || defined(M68040) || \
defined(__HAVE_M68K_PRIVATE_VECTAB)
#define NEED_FIXUP_60
#else
#define BUSERR_HANDLER buserr60
#define ADDRERR_HANDLER addrerr4060
#define UNIMP_II_HANDLER UNIMP_II_HANDLER60
#endif
#endif
#endif
#ifndef MACHINE_RESET_SP
#define MACHINE_RESET_SP NULL
#endif
#ifndef MACHINE_RESET_PC
#define MACHINE_RESET_PC NULL
#endif
#ifndef BUSERR_HANDLER
#define BUSERR_HANDLER badtrap
#endif
#ifndef ADDRERR_HANDLER
#define ADDRERR_HANDLER badtrap
#endif
#ifndef CPV_HANDLER
#define CPV_HANDLER badtrap
#endif
#ifndef UNIMP_II_HANDLER
#define UNIMP_II_HANDLER badtrap
#endif
#ifndef __HAVE_M68K_PRIVATE_VECTAB
void *vectab[NVECTORS] = {
[VECI_RIISP] = MACHINE_RESET_SP,
[VECI_RIPC] = MACHINE_RESET_PC,
[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] = fpfline,
[VECI_rsvd12] = badtrap,
[VECI_CPV] = CPV_HANDLER,
[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_INTRAV0] = 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,
[VECI_TRAP1] = TRAP1_HANDLER,
[VECI_TRAP2] = trap2,
[VECI_TRAP3] = TRAP3_HANDLER,
[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] = badtrap,
[VECI_FP_INEX] = badtrap,
[VECI_FP_DZ] = badtrap,
[VECI_FP_UNFL] = badtrap,
[VECI_FP_OPERR] = badtrap,
[VECI_FP_OVFL] = badtrap,
[VECI_FP_SNAN] = badtrap,
[VECI_UNIMP_FP_DATA] = badtrap,
[VECI_PMMU_CONF] = badtrap,
[VECI_PMMU_ILLOP] = badtrap,
[VECI_PMMU_ACCESS] = badtrap,
[VECI_rsvd59] = badtrap,
[VECI_UNIMP_EA] = badtrap,
[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,
};
#endif
void **saved_vbr;
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] = buserr2030;
vectab[VECI_ADDRERR] = addrerr2030;
break;
#endif
#ifdef NEED_FIXUP_40
case CPU_68040:
vectab[VECI_BUSERR] = buserr40;
vectab[VECI_ADDRERR] = addrerr4060;
DCIS();
break;
#endif
#ifdef NEED_FIXUP_60
case CPU_68060:
vectab[VECI_BUSERR] = buserr60;
vectab[VECI_ADDRERR] = addrerr4060;
vectab[VECI_UNIMP_II] = UNIMP_II_HANDLER60;
DCIS();
break;
#endif
default:
panic("vec_init");
break;
}
#endif
saved_vbr = getvbr();
setvbr(vectab);
}
void
vec_init_fp(void)
{
#ifdef M68K_FPCOPROC
switch (fputype) {
#if defined(M68020) || defined(M68030)
case FPU_68881:
case FPU_68882:
vectab[VECI_FP_BSUN] = fpfault;
vectab[VECI_FP_INEX] = fpfault;
vectab[VECI_FP_DZ] = fpfault;
vectab[VECI_FP_UNFL] = fpfault;
vectab[VECI_FP_OPERR] = fpfault;
vectab[VECI_FP_OVFL] = fpfault;
vectab[VECI_FP_SNAN] = fpfault;
break;
#endif
#if defined(M68040)
case FPU_68040:
vectab[VECI_LINE1111] = LINE1111_HANDLER40;
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;
vectab[VECI_UNIMP_FP_DATA] = UNIMP_FP_DATA_HANDLER40;
DCIS();
break;
#endif
#if defined(M68060)
case FPU_68060:
vectab[VECI_LINE1111] = LINE1111_HANDLER60;
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;
DCIS();
break;
#endif
default:
break;
}
#endif
}
void
vec_reset(void)
{
setvbr(saved_vbr);
}
void *
vec_get_entry(int vec)
{
KASSERT(vec >= 0);
KASSERT(vec < NVECTORS);
return vectab[vec];
}
void
vec_set_entry(int vec, void *addr)
{
KASSERT(vec >= 0);
KASSERT(vec < NVECTORS);
vectab[vec] = addr;
#if defined(M68040) || defined(M68060)
if (cputype == CPU_68040 || cputype == CPU_68060) {
DCIS();
}
#endif
}