Merge branch 'for-linus' of git://github.com/gregungerer/m68knommu
* 'for-linus' of git://github.com/gregungerer/m68knommu: m68k: drop unused Kconfig symbols m68k: drop unused Kconfig symbols m68knommu: create common externs for _ram* vars m68knommu: remove extern declarations of memory_start/memory_end from mm/init m68knommu: use generic section names in mm/init code m68knommu: use generic section names in setup code m68k: merge the mmu and non-mmu traps.c files m68k: move hardware vector setting from traps.c to its own file m68k: merge mmu and non-mmu include/asm/entry.h files m68k: merge the mmu and non-mmu kernel/Makefiles m68k: merge mmu and non-mmu arch Makefiles m68k: reorganize Kconfig options to improve mmu/non-mmu selections m68knommu: fix problems with SPI/GPIO on ColdFire 520x m68k: fix memcpy to unmatched/unaligned source and dest on 68000
This commit is contained in:
@@ -1,5 +1,21 @@
|
||||
ifdef CONFIG_MMU
|
||||
include arch/m68k/kernel/Makefile_mm
|
||||
else
|
||||
include arch/m68k/kernel/Makefile_no
|
||||
#
|
||||
# Makefile for the linux kernel.
|
||||
#
|
||||
|
||||
extra-$(CONFIG_MMU) := head.o
|
||||
extra-$(CONFIG_SUN3) := sun3-head.o
|
||||
extra-y += vmlinux.lds
|
||||
|
||||
obj-y := entry.o m68k_ksyms.o module.o process.o ptrace.o setup.o signal.o \
|
||||
sys_m68k.o syscalltable.o time.o traps.o
|
||||
|
||||
obj-$(CONFIG_MMU) += ints.o devres.o vectors.o
|
||||
devres-$(CONFIG_MMU) = ../../../kernel/irq/devres.o
|
||||
|
||||
ifndef CONFIG_MMU_SUN3
|
||||
obj-y += dma.o
|
||||
endif
|
||||
ifndef CONFIG_MMU
|
||||
obj-y += init_task.o irq.o
|
||||
endif
|
||||
|
||||
|
@@ -1,17 +0,0 @@
|
||||
#
|
||||
# Makefile for the linux kernel.
|
||||
#
|
||||
|
||||
ifndef CONFIG_SUN3
|
||||
extra-y := head.o
|
||||
else
|
||||
extra-y := sun3-head.o
|
||||
endif
|
||||
extra-y += vmlinux.lds
|
||||
|
||||
obj-y := entry.o process.o traps.o ints.o signal.o ptrace.o module.o \
|
||||
sys_m68k.o time.o setup.o m68k_ksyms.o devres.o syscalltable.o
|
||||
|
||||
devres-y = ../../../kernel/irq/devres.o
|
||||
|
||||
obj-y$(CONFIG_MMU_SUN3) += dma.o # no, it's not a typo
|
@@ -1,10 +0,0 @@
|
||||
#
|
||||
# Makefile for arch/m68knommu/kernel.
|
||||
#
|
||||
|
||||
extra-y := vmlinux.lds
|
||||
|
||||
obj-y += dma.o entry.o init_task.o irq.o m68k_ksyms.o process.o ptrace.o \
|
||||
setup.o signal.o syscalltable.o sys_m68k.o time.o traps.o
|
||||
|
||||
obj-$(CONFIG_MODULES) += module.o
|
@@ -43,7 +43,7 @@
|
||||
.globl sys_vfork
|
||||
|
||||
ENTRY(buserr)
|
||||
SAVE_ALL
|
||||
SAVE_ALL_INT
|
||||
moveq #-1,%d0
|
||||
movel %d0,%sp@(PT_OFF_ORIG_D0)
|
||||
movel %sp,%sp@- /* stack frame pointer argument */
|
||||
@@ -52,7 +52,7 @@ ENTRY(buserr)
|
||||
jra ret_from_exception
|
||||
|
||||
ENTRY(trap)
|
||||
SAVE_ALL
|
||||
SAVE_ALL_INT
|
||||
moveq #-1,%d0
|
||||
movel %d0,%sp@(PT_OFF_ORIG_D0)
|
||||
movel %sp,%sp@- /* stack frame pointer argument */
|
||||
@@ -64,7 +64,7 @@ ENTRY(trap)
|
||||
|
||||
.globl dbginterrupt
|
||||
ENTRY(dbginterrupt)
|
||||
SAVE_ALL
|
||||
SAVE_ALL_INT
|
||||
moveq #-1,%d0
|
||||
movel %d0,%sp@(PT_OFF_ORIG_D0)
|
||||
movel %sp,%sp@- /* stack frame pointer argument */
|
||||
|
@@ -36,6 +36,7 @@
|
||||
#include <asm/irq.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/sections.h>
|
||||
|
||||
unsigned long memory_start;
|
||||
unsigned long memory_end;
|
||||
@@ -80,9 +81,6 @@ void (*mach_power_off)(void);
|
||||
#define CPU_INSTR_PER_JIFFY 16
|
||||
#endif
|
||||
|
||||
extern int _stext, _etext, _sdata, _edata, _sbss, _ebss, _end;
|
||||
extern int _ramstart, _ramend;
|
||||
|
||||
#if defined(CONFIG_UBOOT)
|
||||
/*
|
||||
* parse_uboot_commandline
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,361 +0,0 @@
|
||||
/*
|
||||
* linux/arch/m68knommu/kernel/traps.c
|
||||
*
|
||||
* Copyright (C) 1993, 1994 by Hamish Macdonald
|
||||
*
|
||||
* 68040 fixes by Michael Rausch
|
||||
* 68040 fixes by Martin Apel
|
||||
* 68060 fixes by Roman Hodek
|
||||
* 68060 fixes by Jesper Skov
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file COPYING in the main directory of this archive
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Sets up all exception vectors
|
||||
*/
|
||||
#include <linux/sched.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/user.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/ptrace.h>
|
||||
#include <linux/kallsyms.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/fpu.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/traps.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/siginfo.h>
|
||||
|
||||
static char const * const vec_names[] = {
|
||||
"RESET SP", "RESET PC", "BUS ERROR", "ADDRESS ERROR",
|
||||
"ILLEGAL INSTRUCTION", "ZERO DIVIDE", "CHK", "TRAPcc",
|
||||
"PRIVILEGE VIOLATION", "TRACE", "LINE 1010", "LINE 1111",
|
||||
"UNASSIGNED RESERVED 12", "COPROCESSOR PROTOCOL VIOLATION",
|
||||
"FORMAT ERROR", "UNINITIALIZED INTERRUPT",
|
||||
"UNASSIGNED RESERVED 16", "UNASSIGNED RESERVED 17",
|
||||
"UNASSIGNED RESERVED 18", "UNASSIGNED RESERVED 19",
|
||||
"UNASSIGNED RESERVED 20", "UNASSIGNED RESERVED 21",
|
||||
"UNASSIGNED RESERVED 22", "UNASSIGNED RESERVED 23",
|
||||
"SPURIOUS INTERRUPT", "LEVEL 1 INT", "LEVEL 2 INT", "LEVEL 3 INT",
|
||||
"LEVEL 4 INT", "LEVEL 5 INT", "LEVEL 6 INT", "LEVEL 7 INT",
|
||||
"SYSCALL", "TRAP #1", "TRAP #2", "TRAP #3",
|
||||
"TRAP #4", "TRAP #5", "TRAP #6", "TRAP #7",
|
||||
"TRAP #8", "TRAP #9", "TRAP #10", "TRAP #11",
|
||||
"TRAP #12", "TRAP #13", "TRAP #14", "TRAP #15",
|
||||
"FPCP BSUN", "FPCP INEXACT", "FPCP DIV BY 0", "FPCP UNDERFLOW",
|
||||
"FPCP OPERAND ERROR", "FPCP OVERFLOW", "FPCP SNAN",
|
||||
"FPCP UNSUPPORTED OPERATION",
|
||||
"MMU CONFIGURATION ERROR"
|
||||
};
|
||||
|
||||
void die_if_kernel(char *str, struct pt_regs *fp, int nr)
|
||||
{
|
||||
if (!(fp->sr & PS_S))
|
||||
return;
|
||||
|
||||
console_verbose();
|
||||
printk(KERN_EMERG "%s: %08x\n",str,nr);
|
||||
printk(KERN_EMERG "PC: [<%08lx>]\nSR: %04x SP: %p a2: %08lx\n",
|
||||
fp->pc, fp->sr, fp, fp->a2);
|
||||
printk(KERN_EMERG "d0: %08lx d1: %08lx d2: %08lx d3: %08lx\n",
|
||||
fp->d0, fp->d1, fp->d2, fp->d3);
|
||||
printk(KERN_EMERG "d4: %08lx d5: %08lx a0: %08lx a1: %08lx\n",
|
||||
fp->d4, fp->d5, fp->a0, fp->a1);
|
||||
|
||||
printk(KERN_EMERG "Process %s (pid: %d, stackpage=%08lx)\n",
|
||||
current->comm, current->pid, PAGE_SIZE+(unsigned long)current);
|
||||
show_stack(NULL, (unsigned long *)(fp + 1));
|
||||
add_taint(TAINT_DIE);
|
||||
do_exit(SIGSEGV);
|
||||
}
|
||||
|
||||
asmlinkage void buserr_c(struct frame *fp)
|
||||
{
|
||||
/* Only set esp0 if coming from user mode */
|
||||
if (user_mode(&fp->ptregs))
|
||||
current->thread.esp0 = (unsigned long) fp;
|
||||
|
||||
#if defined(DEBUG)
|
||||
printk (KERN_DEBUG "*** Bus Error *** Format is %x\n", fp->ptregs.format);
|
||||
#endif
|
||||
|
||||
die_if_kernel("bad frame format",&fp->ptregs,0);
|
||||
#if defined(DEBUG)
|
||||
printk(KERN_DEBUG "Unknown SIGSEGV - 4\n");
|
||||
#endif
|
||||
force_sig(SIGSEGV, current);
|
||||
}
|
||||
|
||||
static void print_this_address(unsigned long addr, int i)
|
||||
{
|
||||
#ifdef CONFIG_KALLSYMS
|
||||
printk(KERN_EMERG " [%08lx] ", addr);
|
||||
print_symbol(KERN_CONT "%s\n", addr);
|
||||
#else
|
||||
if (i % 5)
|
||||
printk(KERN_CONT " [%08lx] ", addr);
|
||||
else
|
||||
printk(KERN_EMERG " [%08lx] ", addr);
|
||||
i++;
|
||||
#endif
|
||||
}
|
||||
|
||||
int kstack_depth_to_print = 48;
|
||||
|
||||
static void __show_stack(struct task_struct *task, unsigned long *stack)
|
||||
{
|
||||
unsigned long *endstack, addr;
|
||||
#ifdef CONFIG_FRAME_POINTER
|
||||
unsigned long *last_stack;
|
||||
#endif
|
||||
int i;
|
||||
|
||||
if (!stack)
|
||||
stack = (unsigned long *)task->thread.ksp;
|
||||
|
||||
addr = (unsigned long) stack;
|
||||
endstack = (unsigned long *) PAGE_ALIGN(addr);
|
||||
|
||||
printk(KERN_EMERG "Stack from %08lx:", (unsigned long)stack);
|
||||
for (i = 0; i < kstack_depth_to_print; i++) {
|
||||
if (stack + 1 + i > endstack)
|
||||
break;
|
||||
if (i % 8 == 0)
|
||||
printk(KERN_EMERG " ");
|
||||
printk(KERN_CONT " %08lx", *(stack + i));
|
||||
}
|
||||
printk("\n");
|
||||
i = 0;
|
||||
|
||||
#ifdef CONFIG_FRAME_POINTER
|
||||
printk(KERN_EMERG "Call Trace:\n");
|
||||
|
||||
last_stack = stack - 1;
|
||||
while (stack <= endstack && stack > last_stack) {
|
||||
|
||||
addr = *(stack + 1);
|
||||
print_this_address(addr, i);
|
||||
i++;
|
||||
|
||||
last_stack = stack;
|
||||
stack = (unsigned long *)*stack;
|
||||
}
|
||||
printk("\n");
|
||||
#else
|
||||
printk(KERN_EMERG "Call Trace with CONFIG_FRAME_POINTER disabled:\n");
|
||||
while (stack <= endstack) {
|
||||
addr = *stack++;
|
||||
/*
|
||||
* If the address is either in the text segment of the kernel,
|
||||
* or in a region which is occupied by a module then it *may*
|
||||
* be the address of a calling routine; if so, print it so that
|
||||
* someone tracing down the cause of the crash will be able to
|
||||
* figure out the call path that was taken.
|
||||
*/
|
||||
if (__kernel_text_address(addr)) {
|
||||
print_this_address(addr, i);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
printk(KERN_CONT "\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
void bad_super_trap(struct frame *fp)
|
||||
{
|
||||
int vector = (fp->ptregs.vector >> 2) & 0xff;
|
||||
|
||||
console_verbose();
|
||||
if (vector < ARRAY_SIZE(vec_names))
|
||||
printk (KERN_WARNING "*** %s *** FORMAT=%X\n",
|
||||
vec_names[vector],
|
||||
fp->ptregs.format);
|
||||
else
|
||||
printk (KERN_WARNING "*** Exception %d *** FORMAT=%X\n",
|
||||
vector,
|
||||
fp->ptregs.format);
|
||||
printk (KERN_WARNING "Current process id is %d\n", current->pid);
|
||||
die_if_kernel("BAD KERNEL TRAP", &fp->ptregs, 0);
|
||||
}
|
||||
|
||||
asmlinkage void trap_c(struct frame *fp)
|
||||
{
|
||||
int sig;
|
||||
int vector = (fp->ptregs.vector >> 2) & 0xff;
|
||||
siginfo_t info;
|
||||
|
||||
if (fp->ptregs.sr & PS_S) {
|
||||
if (vector == VEC_TRACE) {
|
||||
/* traced a trapping instruction */
|
||||
} else
|
||||
bad_super_trap(fp);
|
||||
return;
|
||||
}
|
||||
|
||||
/* send the appropriate signal to the user program */
|
||||
switch (vector) {
|
||||
case VEC_ADDRERR:
|
||||
info.si_code = BUS_ADRALN;
|
||||
sig = SIGBUS;
|
||||
break;
|
||||
case VEC_ILLEGAL:
|
||||
case VEC_LINE10:
|
||||
case VEC_LINE11:
|
||||
info.si_code = ILL_ILLOPC;
|
||||
sig = SIGILL;
|
||||
break;
|
||||
case VEC_PRIV:
|
||||
info.si_code = ILL_PRVOPC;
|
||||
sig = SIGILL;
|
||||
break;
|
||||
case VEC_COPROC:
|
||||
info.si_code = ILL_COPROC;
|
||||
sig = SIGILL;
|
||||
break;
|
||||
case VEC_TRAP1: /* gdbserver breakpoint */
|
||||
fp->ptregs.pc -= 2;
|
||||
info.si_code = TRAP_TRACE;
|
||||
sig = SIGTRAP;
|
||||
break;
|
||||
case VEC_TRAP2:
|
||||
case VEC_TRAP3:
|
||||
case VEC_TRAP4:
|
||||
case VEC_TRAP5:
|
||||
case VEC_TRAP6:
|
||||
case VEC_TRAP7:
|
||||
case VEC_TRAP8:
|
||||
case VEC_TRAP9:
|
||||
case VEC_TRAP10:
|
||||
case VEC_TRAP11:
|
||||
case VEC_TRAP12:
|
||||
case VEC_TRAP13:
|
||||
case VEC_TRAP14:
|
||||
info.si_code = ILL_ILLTRP;
|
||||
sig = SIGILL;
|
||||
break;
|
||||
case VEC_FPBRUC:
|
||||
case VEC_FPOE:
|
||||
case VEC_FPNAN:
|
||||
info.si_code = FPE_FLTINV;
|
||||
sig = SIGFPE;
|
||||
break;
|
||||
case VEC_FPIR:
|
||||
info.si_code = FPE_FLTRES;
|
||||
sig = SIGFPE;
|
||||
break;
|
||||
case VEC_FPDIVZ:
|
||||
info.si_code = FPE_FLTDIV;
|
||||
sig = SIGFPE;
|
||||
break;
|
||||
case VEC_FPUNDER:
|
||||
info.si_code = FPE_FLTUND;
|
||||
sig = SIGFPE;
|
||||
break;
|
||||
case VEC_FPOVER:
|
||||
info.si_code = FPE_FLTOVF;
|
||||
sig = SIGFPE;
|
||||
break;
|
||||
case VEC_ZERODIV:
|
||||
info.si_code = FPE_INTDIV;
|
||||
sig = SIGFPE;
|
||||
break;
|
||||
case VEC_CHK:
|
||||
case VEC_TRAP:
|
||||
info.si_code = FPE_INTOVF;
|
||||
sig = SIGFPE;
|
||||
break;
|
||||
case VEC_TRACE: /* ptrace single step */
|
||||
info.si_code = TRAP_TRACE;
|
||||
sig = SIGTRAP;
|
||||
break;
|
||||
case VEC_TRAP15: /* breakpoint */
|
||||
info.si_code = TRAP_BRKPT;
|
||||
sig = SIGTRAP;
|
||||
break;
|
||||
default:
|
||||
info.si_code = ILL_ILLOPC;
|
||||
sig = SIGILL;
|
||||
break;
|
||||
}
|
||||
info.si_signo = sig;
|
||||
info.si_errno = 0;
|
||||
switch (fp->ptregs.format) {
|
||||
default:
|
||||
info.si_addr = (void *) fp->ptregs.pc;
|
||||
break;
|
||||
case 2:
|
||||
info.si_addr = (void *) fp->un.fmt2.iaddr;
|
||||
break;
|
||||
case 7:
|
||||
info.si_addr = (void *) fp->un.fmt7.effaddr;
|
||||
break;
|
||||
case 9:
|
||||
info.si_addr = (void *) fp->un.fmt9.iaddr;
|
||||
break;
|
||||
case 10:
|
||||
info.si_addr = (void *) fp->un.fmta.daddr;
|
||||
break;
|
||||
case 11:
|
||||
info.si_addr = (void *) fp->un.fmtb.daddr;
|
||||
break;
|
||||
}
|
||||
force_sig_info (sig, &info, current);
|
||||
}
|
||||
|
||||
asmlinkage void set_esp0(unsigned long ssp)
|
||||
{
|
||||
current->thread.esp0 = ssp;
|
||||
}
|
||||
|
||||
/*
|
||||
* The architecture-independent backtrace generator
|
||||
*/
|
||||
void dump_stack(void)
|
||||
{
|
||||
/*
|
||||
* We need frame pointers for this little trick, which works as follows:
|
||||
*
|
||||
* +------------+ 0x00
|
||||
* | Next SP | -> 0x0c
|
||||
* +------------+ 0x04
|
||||
* | Caller |
|
||||
* +------------+ 0x08
|
||||
* | Local vars | -> our stack var
|
||||
* +------------+ 0x0c
|
||||
* | Next SP | -> 0x18, that is what we pass to show_stack()
|
||||
* +------------+ 0x10
|
||||
* | Caller |
|
||||
* +------------+ 0x14
|
||||
* | Local vars |
|
||||
* +------------+ 0x18
|
||||
* | ... |
|
||||
* +------------+
|
||||
*/
|
||||
|
||||
unsigned long *stack;
|
||||
|
||||
stack = (unsigned long *)&stack;
|
||||
stack++;
|
||||
__show_stack(current, stack);
|
||||
}
|
||||
EXPORT_SYMBOL(dump_stack);
|
||||
|
||||
void show_stack(struct task_struct *task, unsigned long *stack)
|
||||
{
|
||||
if (!stack && !task)
|
||||
dump_stack();
|
||||
else
|
||||
__show_stack(task, stack);
|
||||
}
|
145
arch/m68k/kernel/vectors.c
Normal file
145
arch/m68k/kernel/vectors.c
Normal file
@@ -0,0 +1,145 @@
|
||||
/*
|
||||
* vectors.c
|
||||
*
|
||||
* Copyright (C) 1993, 1994 by Hamish Macdonald
|
||||
*
|
||||
* 68040 fixes by Michael Rausch
|
||||
* 68040 fixes by Martin Apel
|
||||
* 68040 fixes and writeback by Richard Zidlicky
|
||||
* 68060 fixes by Roman Hodek
|
||||
* 68060 fixes by Jesper Skov
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file COPYING in the main directory of this archive
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Sets up all exception vectors
|
||||
*/
|
||||
#include <linux/sched.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kallsyms.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/fpu.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/traps.h>
|
||||
|
||||
/* assembler routines */
|
||||
asmlinkage void system_call(void);
|
||||
asmlinkage void buserr(void);
|
||||
asmlinkage void trap(void);
|
||||
asmlinkage void nmihandler(void);
|
||||
#ifdef CONFIG_M68KFPU_EMU
|
||||
asmlinkage void fpu_emu(void);
|
||||
#endif
|
||||
|
||||
e_vector vectors[256];
|
||||
|
||||
/* nmi handler for the Amiga */
|
||||
asm(".text\n"
|
||||
__ALIGN_STR "\n"
|
||||
"nmihandler: rte");
|
||||
|
||||
/*
|
||||
* this must be called very early as the kernel might
|
||||
* use some instruction that are emulated on the 060
|
||||
* and so we're prepared for early probe attempts (e.g. nf_init).
|
||||
*/
|
||||
void __init base_trap_init(void)
|
||||
{
|
||||
if (MACH_IS_SUN3X) {
|
||||
extern e_vector *sun3x_prom_vbr;
|
||||
|
||||
__asm__ volatile ("movec %%vbr, %0" : "=r" (sun3x_prom_vbr));
|
||||
}
|
||||
|
||||
/* setup the exception vector table */
|
||||
__asm__ volatile ("movec %0,%%vbr" : : "r" ((void*)vectors));
|
||||
|
||||
if (CPU_IS_060) {
|
||||
/* set up ISP entry points */
|
||||
asmlinkage void unimp_vec(void) asm ("_060_isp_unimp");
|
||||
|
||||
vectors[VEC_UNIMPII] = unimp_vec;
|
||||
}
|
||||
|
||||
vectors[VEC_BUSERR] = buserr;
|
||||
vectors[VEC_ILLEGAL] = trap;
|
||||
vectors[VEC_SYS] = system_call;
|
||||
}
|
||||
|
||||
void __init trap_init (void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = VEC_SPUR; i <= VEC_INT7; i++)
|
||||
vectors[i] = bad_inthandler;
|
||||
|
||||
for (i = 0; i < VEC_USER; i++)
|
||||
if (!vectors[i])
|
||||
vectors[i] = trap;
|
||||
|
||||
for (i = VEC_USER; i < 256; i++)
|
||||
vectors[i] = bad_inthandler;
|
||||
|
||||
#ifdef CONFIG_M68KFPU_EMU
|
||||
if (FPU_IS_EMU)
|
||||
vectors[VEC_LINE11] = fpu_emu;
|
||||
#endif
|
||||
|
||||
if (CPU_IS_040 && !FPU_IS_EMU) {
|
||||
/* set up FPSP entry points */
|
||||
asmlinkage void dz_vec(void) asm ("dz");
|
||||
asmlinkage void inex_vec(void) asm ("inex");
|
||||
asmlinkage void ovfl_vec(void) asm ("ovfl");
|
||||
asmlinkage void unfl_vec(void) asm ("unfl");
|
||||
asmlinkage void snan_vec(void) asm ("snan");
|
||||
asmlinkage void operr_vec(void) asm ("operr");
|
||||
asmlinkage void bsun_vec(void) asm ("bsun");
|
||||
asmlinkage void fline_vec(void) asm ("fline");
|
||||
asmlinkage void unsupp_vec(void) asm ("unsupp");
|
||||
|
||||
vectors[VEC_FPDIVZ] = dz_vec;
|
||||
vectors[VEC_FPIR] = inex_vec;
|
||||
vectors[VEC_FPOVER] = ovfl_vec;
|
||||
vectors[VEC_FPUNDER] = unfl_vec;
|
||||
vectors[VEC_FPNAN] = snan_vec;
|
||||
vectors[VEC_FPOE] = operr_vec;
|
||||
vectors[VEC_FPBRUC] = bsun_vec;
|
||||
vectors[VEC_LINE11] = fline_vec;
|
||||
vectors[VEC_FPUNSUP] = unsupp_vec;
|
||||
}
|
||||
|
||||
if (CPU_IS_060 && !FPU_IS_EMU) {
|
||||
/* set up IFPSP entry points */
|
||||
asmlinkage void snan_vec6(void) asm ("_060_fpsp_snan");
|
||||
asmlinkage void operr_vec6(void) asm ("_060_fpsp_operr");
|
||||
asmlinkage void ovfl_vec6(void) asm ("_060_fpsp_ovfl");
|
||||
asmlinkage void unfl_vec6(void) asm ("_060_fpsp_unfl");
|
||||
asmlinkage void dz_vec6(void) asm ("_060_fpsp_dz");
|
||||
asmlinkage void inex_vec6(void) asm ("_060_fpsp_inex");
|
||||
asmlinkage void fline_vec6(void) asm ("_060_fpsp_fline");
|
||||
asmlinkage void unsupp_vec6(void) asm ("_060_fpsp_unsupp");
|
||||
asmlinkage void effadd_vec6(void) asm ("_060_fpsp_effadd");
|
||||
|
||||
vectors[VEC_FPNAN] = snan_vec6;
|
||||
vectors[VEC_FPOE] = operr_vec6;
|
||||
vectors[VEC_FPOVER] = ovfl_vec6;
|
||||
vectors[VEC_FPUNDER] = unfl_vec6;
|
||||
vectors[VEC_FPDIVZ] = dz_vec6;
|
||||
vectors[VEC_FPIR] = inex_vec6;
|
||||
vectors[VEC_LINE11] = fline_vec6;
|
||||
vectors[VEC_FPUNSUP] = unsupp_vec6;
|
||||
vectors[VEC_UNIMPEA] = effadd_vec6;
|
||||
}
|
||||
|
||||
/* if running on an amiga, make the NMI interrupt do nothing */
|
||||
if (MACH_IS_AMIGA) {
|
||||
vectors[VEC_INT7] = nmihandler;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user