1bc4f4ac2SGreg Ungerer /* 2bc4f4ac2SGreg Ungerer * vectors.c 3bc4f4ac2SGreg Ungerer * 4bc4f4ac2SGreg Ungerer * Copyright (C) 1993, 1994 by Hamish Macdonald 5bc4f4ac2SGreg Ungerer * 6bc4f4ac2SGreg Ungerer * 68040 fixes by Michael Rausch 7bc4f4ac2SGreg Ungerer * 68040 fixes by Martin Apel 8bc4f4ac2SGreg Ungerer * 68040 fixes and writeback by Richard Zidlicky 9bc4f4ac2SGreg Ungerer * 68060 fixes by Roman Hodek 10bc4f4ac2SGreg Ungerer * 68060 fixes by Jesper Skov 11bc4f4ac2SGreg Ungerer * 12bc4f4ac2SGreg Ungerer * This file is subject to the terms and conditions of the GNU General Public 13bc4f4ac2SGreg Ungerer * License. See the file COPYING in the main directory of this archive 14bc4f4ac2SGreg Ungerer * for more details. 15bc4f4ac2SGreg Ungerer */ 16bc4f4ac2SGreg Ungerer 17bc4f4ac2SGreg Ungerer /* 18bc4f4ac2SGreg Ungerer * Sets up all exception vectors 19bc4f4ac2SGreg Ungerer */ 20bc4f4ac2SGreg Ungerer #include <linux/sched.h> 21bc4f4ac2SGreg Ungerer #include <linux/kernel.h> 22bc4f4ac2SGreg Ungerer #include <linux/linkage.h> 23bc4f4ac2SGreg Ungerer #include <linux/init.h> 24bc4f4ac2SGreg Ungerer #include <linux/kallsyms.h> 25bc4f4ac2SGreg Ungerer 26bc4f4ac2SGreg Ungerer #include <asm/setup.h> 27bc4f4ac2SGreg Ungerer #include <asm/fpu.h> 28bc4f4ac2SGreg Ungerer #include <asm/traps.h> 29bc4f4ac2SGreg Ungerer 30bc4f4ac2SGreg Ungerer /* assembler routines */ 31bc4f4ac2SGreg Ungerer asmlinkage void system_call(void); 32bc4f4ac2SGreg Ungerer asmlinkage void buserr(void); 33bc4f4ac2SGreg Ungerer asmlinkage void trap(void); 34bc4f4ac2SGreg Ungerer asmlinkage void nmihandler(void); 35bc4f4ac2SGreg Ungerer #ifdef CONFIG_M68KFPU_EMU 36bc4f4ac2SGreg Ungerer asmlinkage void fpu_emu(void); 37bc4f4ac2SGreg Ungerer #endif 38bc4f4ac2SGreg Ungerer 39bc4f4ac2SGreg Ungerer e_vector vectors[256]; 40bc4f4ac2SGreg Ungerer 41bc4f4ac2SGreg Ungerer /* nmi handler for the Amiga */ 42bc4f4ac2SGreg Ungerer asm(".text\n" 43bc4f4ac2SGreg Ungerer __ALIGN_STR "\n" 44bc4f4ac2SGreg Ungerer "nmihandler: rte"); 45bc4f4ac2SGreg Ungerer 46bc4f4ac2SGreg Ungerer /* 47bc4f4ac2SGreg Ungerer * this must be called very early as the kernel might 48bc4f4ac2SGreg Ungerer * use some instruction that are emulated on the 060 49bc4f4ac2SGreg Ungerer * and so we're prepared for early probe attempts (e.g. nf_init). 50bc4f4ac2SGreg Ungerer */ base_trap_init(void)51bc4f4ac2SGreg Ungerervoid __init base_trap_init(void) 52bc4f4ac2SGreg Ungerer { 53bc4f4ac2SGreg Ungerer if (MACH_IS_SUN3X) { 54bc4f4ac2SGreg Ungerer extern e_vector *sun3x_prom_vbr; 55bc4f4ac2SGreg Ungerer 56bc4f4ac2SGreg Ungerer __asm__ volatile ("movec %%vbr, %0" : "=r" (sun3x_prom_vbr)); 57bc4f4ac2SGreg Ungerer } 58bc4f4ac2SGreg Ungerer 59bc4f4ac2SGreg Ungerer /* setup the exception vector table */ 60bc4f4ac2SGreg Ungerer __asm__ volatile ("movec %0,%%vbr" : : "r" ((void*)vectors)); 61bc4f4ac2SGreg Ungerer 62bc4f4ac2SGreg Ungerer if (CPU_IS_060) { 63bc4f4ac2SGreg Ungerer /* set up ISP entry points */ 64bc4f4ac2SGreg Ungerer asmlinkage void unimp_vec(void) asm ("_060_isp_unimp"); 65bc4f4ac2SGreg Ungerer 66bc4f4ac2SGreg Ungerer vectors[VEC_UNIMPII] = unimp_vec; 67bc4f4ac2SGreg Ungerer } 68bc4f4ac2SGreg Ungerer 69bc4f4ac2SGreg Ungerer vectors[VEC_BUSERR] = buserr; 70bc4f4ac2SGreg Ungerer vectors[VEC_ILLEGAL] = trap; 71bc4f4ac2SGreg Ungerer vectors[VEC_SYS] = system_call; 72bc4f4ac2SGreg Ungerer } 73bc4f4ac2SGreg Ungerer trap_init(void)74bc4f4ac2SGreg Ungerervoid __init trap_init (void) 75bc4f4ac2SGreg Ungerer { 76bc4f4ac2SGreg Ungerer int i; 77bc4f4ac2SGreg Ungerer 78bc4f4ac2SGreg Ungerer for (i = VEC_SPUR; i <= VEC_INT7; i++) 79bc4f4ac2SGreg Ungerer vectors[i] = bad_inthandler; 80bc4f4ac2SGreg Ungerer 81bc4f4ac2SGreg Ungerer for (i = 0; i < VEC_USER; i++) 82bc4f4ac2SGreg Ungerer if (!vectors[i]) 83bc4f4ac2SGreg Ungerer vectors[i] = trap; 84bc4f4ac2SGreg Ungerer 85bc4f4ac2SGreg Ungerer for (i = VEC_USER; i < 256; i++) 86bc4f4ac2SGreg Ungerer vectors[i] = bad_inthandler; 87bc4f4ac2SGreg Ungerer 88bc4f4ac2SGreg Ungerer #ifdef CONFIG_M68KFPU_EMU 89bc4f4ac2SGreg Ungerer if (FPU_IS_EMU) 90bc4f4ac2SGreg Ungerer vectors[VEC_LINE11] = fpu_emu; 91bc4f4ac2SGreg Ungerer #endif 92bc4f4ac2SGreg Ungerer 93bc4f4ac2SGreg Ungerer if (CPU_IS_040 && !FPU_IS_EMU) { 94bc4f4ac2SGreg Ungerer /* set up FPSP entry points */ 95bc4f4ac2SGreg Ungerer asmlinkage void dz_vec(void) asm ("dz"); 96bc4f4ac2SGreg Ungerer asmlinkage void inex_vec(void) asm ("inex"); 97bc4f4ac2SGreg Ungerer asmlinkage void ovfl_vec(void) asm ("ovfl"); 98bc4f4ac2SGreg Ungerer asmlinkage void unfl_vec(void) asm ("unfl"); 99bc4f4ac2SGreg Ungerer asmlinkage void snan_vec(void) asm ("snan"); 100bc4f4ac2SGreg Ungerer asmlinkage void operr_vec(void) asm ("operr"); 101bc4f4ac2SGreg Ungerer asmlinkage void bsun_vec(void) asm ("bsun"); 102bc4f4ac2SGreg Ungerer asmlinkage void fline_vec(void) asm ("fline"); 103bc4f4ac2SGreg Ungerer asmlinkage void unsupp_vec(void) asm ("unsupp"); 104bc4f4ac2SGreg Ungerer 105bc4f4ac2SGreg Ungerer vectors[VEC_FPDIVZ] = dz_vec; 106bc4f4ac2SGreg Ungerer vectors[VEC_FPIR] = inex_vec; 107bc4f4ac2SGreg Ungerer vectors[VEC_FPOVER] = ovfl_vec; 108bc4f4ac2SGreg Ungerer vectors[VEC_FPUNDER] = unfl_vec; 109bc4f4ac2SGreg Ungerer vectors[VEC_FPNAN] = snan_vec; 110bc4f4ac2SGreg Ungerer vectors[VEC_FPOE] = operr_vec; 111bc4f4ac2SGreg Ungerer vectors[VEC_FPBRUC] = bsun_vec; 112bc4f4ac2SGreg Ungerer vectors[VEC_LINE11] = fline_vec; 113bc4f4ac2SGreg Ungerer vectors[VEC_FPUNSUP] = unsupp_vec; 114bc4f4ac2SGreg Ungerer } 115bc4f4ac2SGreg Ungerer 116bc4f4ac2SGreg Ungerer if (CPU_IS_060 && !FPU_IS_EMU) { 117bc4f4ac2SGreg Ungerer /* set up IFPSP entry points */ 118bc4f4ac2SGreg Ungerer asmlinkage void snan_vec6(void) asm ("_060_fpsp_snan"); 119bc4f4ac2SGreg Ungerer asmlinkage void operr_vec6(void) asm ("_060_fpsp_operr"); 120bc4f4ac2SGreg Ungerer asmlinkage void ovfl_vec6(void) asm ("_060_fpsp_ovfl"); 121bc4f4ac2SGreg Ungerer asmlinkage void unfl_vec6(void) asm ("_060_fpsp_unfl"); 122bc4f4ac2SGreg Ungerer asmlinkage void dz_vec6(void) asm ("_060_fpsp_dz"); 123bc4f4ac2SGreg Ungerer asmlinkage void inex_vec6(void) asm ("_060_fpsp_inex"); 124bc4f4ac2SGreg Ungerer asmlinkage void fline_vec6(void) asm ("_060_fpsp_fline"); 125bc4f4ac2SGreg Ungerer asmlinkage void unsupp_vec6(void) asm ("_060_fpsp_unsupp"); 126bc4f4ac2SGreg Ungerer asmlinkage void effadd_vec6(void) asm ("_060_fpsp_effadd"); 127bc4f4ac2SGreg Ungerer 128bc4f4ac2SGreg Ungerer vectors[VEC_FPNAN] = snan_vec6; 129bc4f4ac2SGreg Ungerer vectors[VEC_FPOE] = operr_vec6; 130bc4f4ac2SGreg Ungerer vectors[VEC_FPOVER] = ovfl_vec6; 131bc4f4ac2SGreg Ungerer vectors[VEC_FPUNDER] = unfl_vec6; 132bc4f4ac2SGreg Ungerer vectors[VEC_FPDIVZ] = dz_vec6; 133bc4f4ac2SGreg Ungerer vectors[VEC_FPIR] = inex_vec6; 134bc4f4ac2SGreg Ungerer vectors[VEC_LINE11] = fline_vec6; 135bc4f4ac2SGreg Ungerer vectors[VEC_FPUNSUP] = unsupp_vec6; 136bc4f4ac2SGreg Ungerer vectors[VEC_UNIMPEA] = effadd_vec6; 137bc4f4ac2SGreg Ungerer } 138bc4f4ac2SGreg Ungerer 139bc4f4ac2SGreg Ungerer /* if running on an amiga, make the NMI interrupt do nothing */ 140bc4f4ac2SGreg Ungerer if (MACH_IS_AMIGA) { 141bc4f4ac2SGreg Ungerer vectors[VEC_INT7] = nmihandler; 142bc4f4ac2SGreg Ungerer } 143bc4f4ac2SGreg Ungerer } 144bc4f4ac2SGreg Ungerer 145