Handle fpu interrupts (MIPS interrupt 0) on IP12.

This commit is contained in:
rumble 2006-12-28 16:15:11 +00:00
parent 88bbf6ee26
commit c77d82ad5f
2 changed files with 24 additions and 4 deletions

View File

@ -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
}

View File

@ -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 */