Handle fpu interrupts (MIPS interrupt 0) on IP12.
This commit is contained in:
parent
88bbf6ee26
commit
c77d82ad5f
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: cpu.c,v 1.19 2005/12/11 12:18:58 christos Exp $ */
|
||||
/* $NetBSD: cpu.c,v 1.20 2006/12/28 16:15:11 rumble Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2000 Soren S. Jorvang
|
||||
|
@ -35,7 +35,7 @@
|
|||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.19 2005/12/11 12:18:58 christos Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.20 2006/12/28 16:15:11 rumble Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/device.h>
|
||||
|
@ -44,6 +44,7 @@ __KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.19 2005/12/11 12:18:58 christos Exp $");
|
|||
|
||||
#include <machine/cpu.h>
|
||||
#include <machine/locore.h>
|
||||
#include <machine/psl.h>
|
||||
#include <machine/autoconf.h>
|
||||
#include <machine/machtype.h>
|
||||
#include <machine/sysconf.h>
|
||||
|
@ -55,6 +56,9 @@ static int cpu_match(struct device *, struct cfdata *, void *);
|
|||
static void cpu_attach(struct device *, struct device *, void *);
|
||||
void cpu_intr(u_int32_t, u_int32_t, u_int32_t, u_int32_t);
|
||||
void *cpu_intr_establish(int, int, int (*func)(void *), void *);
|
||||
void mips1_fpu_intr(u_int32_t, u_int32_t, u_int32_t, u_int32_t);
|
||||
|
||||
extern void MachFPInterrupt(u_int32_t, u_int32_t, u_int32_t, struct frame *);
|
||||
|
||||
static struct evcnt mips_int0_evcnt =
|
||||
EVCNT_INITIALIZER(EVCNT_TYPE_INTR, NULL, "mips", "int 0");
|
||||
|
@ -161,3 +165,17 @@ cpu_intr_establish(int level, int ipl, int (*func)(void *), void *arg)
|
|||
(*platform.intr_establish)(level, ipl, func, arg);
|
||||
return (void *) -1;
|
||||
}
|
||||
|
||||
void
|
||||
mips1_fpu_intr(u_int32_t status, u_int32_t cause, u_int32_t pc,
|
||||
u_int32_t ipending)
|
||||
{
|
||||
|
||||
if (!USERMODE(status))
|
||||
panic("kernel used FPU: PC 0x%08x, CR 0x%08x, SR 0x%08x",
|
||||
pc, cause, status);
|
||||
|
||||
#if !defined(NOFPU) && !defined(SOFTFLOAT)
|
||||
MachFPInterrupt(status, cause, pc, curlwp->l_md.md_regs);
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: machdep.c,v 1.101 2006/12/27 07:45:11 rumble Exp $ */
|
||||
/* $NetBSD: machdep.c,v 1.102 2006/12/28 16:15:11 rumble Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2000 Soren S. Jorvang
|
||||
|
@ -34,7 +34,7 @@
|
|||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.101 2006/12/27 07:45:11 rumble Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.102 2006/12/28 16:15:11 rumble Exp $");
|
||||
|
||||
#include "opt_ddb.h"
|
||||
#include "opt_kgdb.h"
|
||||
|
@ -181,6 +181,7 @@ extern void ip22_sdcache_enable(void);
|
|||
|
||||
#if defined(MIPS1)
|
||||
extern void mips1_clock_intr(u_int32_t, u_int32_t, u_int32_t, u_int32_t);
|
||||
extern void mips1_fpu_intr(u_int32_t, u_int32_t, u_int32_t, u_int32_t);
|
||||
#endif
|
||||
|
||||
#if defined(MIPS3)
|
||||
|
@ -448,6 +449,7 @@ mach_init(int argc, char **argv, int magic, struct btinfo_common *btinfo)
|
|||
}
|
||||
|
||||
ipl2spl_table = sgi_ip12_ipl2spl_table;
|
||||
platform.intr0 = mips1_fpu_intr;
|
||||
platform.intr3 = mips1_clock_intr;
|
||||
break;
|
||||
#endif /* MIPS1 */
|
||||
|
|
Loading…
Reference in New Issue