Fix vectored interrupts, and do autovectored ones similarly.

This commit is contained in:
gwr 1995-08-21 21:37:36 +00:00
parent 35a5b206df
commit acbfd7b67d
5 changed files with 128 additions and 165 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: clock.c,v 1.25 1995/08/08 21:05:48 gwr Exp $ */
/* $NetBSD: clock.c,v 1.26 1995/08/21 21:37:36 gwr Exp $ */
/*
* Copyright (c) 1994 Gordon W. Ross
@ -100,7 +100,6 @@ int clockmatch(parent, vcf, args)
return (1);
}
extern void level5intr_clock();
void clockattach(parent, self, args)
struct device *parent;
struct device *self;
@ -206,12 +205,13 @@ void
cpu_initclocks(void)
{
int s;
extern void _isr_clock();
if (!intersil_clock)
panic("cpu_initclocks");
s = splhigh();
isr_add_custom(5, level5intr_clock);
isr_add_custom(5, _isr_clock);
#ifdef DIAGNOSTIC
clk_intr_ready = 1;
#endif

View File

@ -1,4 +1,4 @@
/* $NetBSD: isr.c,v 1.18 1995/07/04 12:37:42 paulus Exp $ */
/* $NetBSD: isr.c,v 1.19 1995/08/21 21:37:38 gwr Exp $ */
/*
* Copyright (c) 1994 Gordon W. Ross
@ -53,7 +53,7 @@
extern int intrcnt[]; /* statistics */
#define NISR 8
#define NUM_LEVELS 8
struct isr {
struct isr *isr_next;
@ -62,7 +62,9 @@ struct isr {
int isr_ipl;
};
static struct isr *isr_autovec_list[NISR];
void set_vector_entry __P((int, void (*handler)()));
unsigned int get_vector_entry __P((int));
volatile u_char *interrupt_reg;
@ -79,7 +81,7 @@ void isr_add_custom(level, handler)
int level;
void (*handler)();
{
set_vector_entry(AUTO_VECTOR_BASE + level, handler);
set_vector_entry(AUTOVEC_BASE + level, handler);
}
static int isr_soft_pending;
@ -220,15 +222,22 @@ int soft1intr(fp)
}
static struct isr *isr_autovec_list[NUM_LEVELS];
/*
* This is called by the assembly routines
* for handling auto-vectored interupts.
*/
void isr_autovec(ipl)
int ipl;
void isr_autovec(evec)
int evec; /* format | vector offset */
{
struct isr *isr;
register int n;
register int n, ipl, vec;
vec = (evec & 0xFFF) >> 2;
if ((vec < AUTOVEC_BASE) || (vec >= (AUTOVEC_BASE+8)))
panic("isr_autovec: bad vec");
ipl = vec - 0x18;
n = intrcnt[ipl];
intrcnt[ipl] = n+1;
@ -262,7 +271,7 @@ void isr_add_autovect(handler, arg, level)
{
struct isr *new_isr;
if ((level < 0) || (level >= NISR))
if ((level < 0) || (level >= NUM_LEVELS))
panic("isr_add: bad level=%d", level);
new_isr = (struct isr *)
malloc(sizeof(struct isr), M_DEVBUF, M_NOWAIT);
@ -289,11 +298,12 @@ static struct vector_handler isr_vector_handlers[192];
*/
void
isr_vectored(evec)
u_short evec;
int evec; /* format | vector offset */
{
int ipl, vec = evec >> 4;
struct vector_handler *vh;
register int ipl, vec;
vec = (evec & 0xFFF) >> 2;
ipl = getsr();
ipl = (ipl >> 8) & 7;
@ -320,7 +330,7 @@ isr_vectored(evec)
* Establish an interrupt handler.
* Called by driver attach functions.
*/
extern void vect_intr();
extern void _isr_vectored();
void isr_add_vectored(func, arg, level, vec)
int (*func)();
void *arg;
@ -339,5 +349,24 @@ void isr_add_vectored(func, arg, level, vec)
}
vh->func = func;
vh->arg = arg;
set_vector_entry(vec, vect_intr);
set_vector_entry(vec, _isr_vectored);
}
/*
* XXX - could just kill these...
*/
void set_vector_entry(entry, handler)
int entry;
void (*handler)();
{
if ((entry <0) || (entry >= NVECTORS))
panic("set_vector_entry: setting vector too high or low\n");
vector_table[entry] = handler;
}
unsigned int get_vector_entry(entry)
int entry;
{
if ((entry <0) || (entry >= NVECTORS))
panic("get_vector_entry: setting vector too high or low\n");
return (unsigned int) vector_table[entry];
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: locore.s,v 1.31 1995/06/13 22:16:38 gwr Exp $ */
/* $NetBSD: locore.s,v 1.32 1995/08/21 21:37:40 gwr Exp $ */
/*
* Copyright (c) 1994, 1995 Gordon W. Ross
@ -546,70 +546,29 @@ Lsigr1:
#define INTERRUPT_SAVEREG \
moveml #0xC0C0,sp@-
#define INTERRUPT_BODY(num) \
pea num ;\
jbsr _isr_autovec ;\
addql #4,sp
#define INTERRUPT_RESTORE \
moveml sp@+,#0x0303
#define INTERRUPT_HANDLE(num) ;\
INTERRUPT_SAVEREG ;\
INTERRUPT_BODY(num) ;\
INTERRUPT_RESTORE ;\
jra rei /* XXX - Just do rte here? */
.globl _level0intr, _level1intr, _level2intr, _level3intr
.globl _level4intr, _level5intr, _level6intr, _level7intr
.align 4
/*
* These are the auto-vector interrupt handlers,
* for which the CPU provides the vector=0x18+level
* This is the common auto-vector interrupt handler,
* for which the CPU provides the vector=0x18+level.
* These are installed in the interrupt vector table.
*/
/* spurious interrupt */
_level0intr:
INTERRUPT_HANDLE(0)
/* system enable register 1 */
.align 4
_level1intr:
INTERRUPT_HANDLE(1)
/* system enable register 2, SCSI */
.align 4
_level2intr:
INTERRUPT_HANDLE(2)
.globl __isr_autovec
__isr_autovec:
INTERRUPT_SAVEREG
movw sp@(22),sp@- | push exception vector info
clrw sp@-
jbsr _isr_autovec | C dispatcher
addql #4,sp
INTERRUPT_RESTORE
jra rei /* XXX - Just do rte here? */
/* system enable register 3, Ethernet */
/* clock: see clock.c */
.globl __isr_clock, _interrupt_reg, _clock_intr, _clock_va
.align 4
_level3intr:
INTERRUPT_HANDLE(3)
/* video */
.align 4
_level4intr:
INTERRUPT_HANDLE(4)
/* clock (see below) */
.align 4
_level5intr:
INTERRUPT_HANDLE(5)
/* SCCs */
.align 4
_level6intr:
INTERRUPT_HANDLE(6)
/* Memory Error/NMI */
.align 4
_level7intr:
INTERRUPT_HANDLE(7)
/* clock */
.globl _level5intr_clock, _interrupt_reg, _clock_intr, _clock_va
.align 4
_level5intr_clock:
__isr_clock:
INTERRUPT_SAVEREG | save a0, a1, d0, d1
movl _clock_va, a0
movl _interrupt_reg, a1
@ -625,9 +584,10 @@ _level5intr_clock:
INTERRUPT_RESTORE
jra rei
| Handler for all vectored interrupts (i.e. VME interrupts)
.globl _isr_vectored
.globl _vect_intr
_vect_intr:
.globl __isr_vectored
__isr_vectored:
INTERRUPT_SAVEREG
movw sp@(22),sp@- | push exception vector info
clrw sp@-
@ -638,9 +598,7 @@ _vect_intr:
#undef INTERRUPT_SAVEREG
#undef INTERRUPT_BODY
#undef INTERRUPT_RESTORE
#undef INTERRUPT_HANDLE
/* interrupt counters (needed by vmstat) */
.globl _intrcnt,_eintrcnt,_intrnames,_eintrnames

View File

@ -1,4 +1,4 @@
/* $NetBSD: vector.c,v 1.12 1995/01/18 17:14:47 gwr Exp $ */
/* $NetBSD: vector.c,v 1.13 1995/08/21 21:37:41 gwr Exp $ */
/*
* Copyright (c) 1994 Gordon W. Ross
@ -46,8 +46,7 @@ void addrerr(), badtrap(), buserr(), chkinst(), coperr(), fmterr(),
fpfline(), fpunsupp(), illinst(), privinst(), trace(), trap0(),
trap1(), trap12(), trap15(), trap2(), trapvinst(), zerodiv(), fpfault();
void level0intr(), level1intr(), level2intr(), level3intr();
void level4intr(), level5intr(), level6intr(), level7intr();
void _isr_autovec();
#define fpbsun fpfault
#define fpdz fpfault
@ -60,68 +59,68 @@ void level4intr(), level5intr(), level6intr(), level7intr();
void (*vector_table[NVECTORS])() = {
(void*)0xfffe000, /* 0: NOT USED (reset SP) */
(void*)0xfef0000, /* 1: NOT USED (reset PC) */
buserr, /* 2: bus error */
addrerr, /* 3: address error */
illinst, /* 4: illegal instruction */
zerodiv, /* 5: zero divide */
chkinst, /* 6: CHK instruction */
trapvinst, /* 7: TRAPV instruction */
privinst, /* 8: privilege violation */
trace, /* 9: trace */
illinst, /* 10: line 1010 emulator */
fpfline, /* 11: line 1111 emulator */
badtrap, /* 12: unassigned, reserved */
coperr, /* 13: coprocessor protocol violatio */
fmterr, /* 14: format error */
badtrap, /* 15: uninitialized interrupt vecto */
badtrap, /* 16: unassigned, reserved */
badtrap, /* 17: unassigned, reserved */
badtrap, /* 18: unassigned, reserved */
badtrap, /* 19: unassigned, reserved */
badtrap, /* 20: unassigned, reserved */
badtrap, /* 21: unassigned, reserved */
badtrap, /* 22: unassigned, reserved */
badtrap, /* 23: unassigned, reserved */
level0intr, /* 24: spurious interrupt */
level1intr, /* 25: level 1 interrupt autovector */
level2intr, /* 26: level 2 interrupt autovector */
level3intr, /* 27: level 3 interrupt autovector */
level4intr, /* 28: level 4 interrupt autovector */
level5intr, /* 29: level 5 interrupt autovector */
level6intr, /* 30: level 6 interrupt autovector */
level7intr, /* 31: level 7 interrupt autovector */
trap0, /* 32: syscalls (at least on hp300) */
trap1, /* 33: sigreturn syscall or breakpoi */
trap2, /* 34: breakpoint or sigreturn sysca */
illinst, /* 35: TRAP instruction vector */
illinst, /* 36: TRAP instruction vector */
illinst, /* 37: TRAP instruction vector */
illinst, /* 38: TRAP instruction vector */
illinst, /* 39: TRAP instruction vector */
illinst, /* 40: TRAP instruction vector */
illinst, /* 41: TRAP instruction vector */
illinst, /* 42: TRAP instruction vector */
illinst, /* 43: TRAP instruction vector */
trap12, /* 44: TRAP instruction vector */
illinst, /* 45: TRAP instruction vector */
illinst, /* 46: TRAP instruction vector */
trap15, /* 47: TRAP instruction vector */
fpbsun, /* 48: FPCP branch/set on unordered */
fpinex, /* 49: FPCP inexact result */
fpdz, /* 50: FPCP divide by zero */
fpunfl, /* 51: FPCP underflow */
fpoperr, /* 52: FPCP operand error */
fpovfl, /* 53: FPCP overflow */
fpsnan, /* 54: FPCP signalling NAN */
fpunsupp, /* 55: FPCP unimplemented data type */
badtrap, /* 56: unassigned, reserved */
badtrap, /* 57: unassigned, reserved */
badtrap, /* 58: unassigned, reserved */
badtrap, /* 59: unassigned, reserved */
badtrap, /* 60: unassigned, reserved */
badtrap, /* 61: unassigned, reserved */
badtrap, /* 62: unassigned, reserved */
badtrap, /* 63: unassigned, reserved */
buserr, /* 2: bus error */
addrerr, /* 3: address error */
illinst, /* 4: illegal instruction */
zerodiv, /* 5: zero divide */
chkinst, /* 6: CHK instruction */
trapvinst, /* 7: TRAPV instruction */
privinst, /* 8: privilege violation */
trace, /* 9: trace */
illinst, /* 10: line 1010 emulator */
fpfline, /* 11: line 1111 emulator */
badtrap, /* 12: unassigned, reserved */
coperr, /* 13: coprocessor protocol violatio */
fmterr, /* 14: format error */
badtrap, /* 15: uninitialized interrupt vecto */
badtrap, /* 16: unassigned, reserved */
badtrap, /* 17: unassigned, reserved */
badtrap, /* 18: unassigned, reserved */
badtrap, /* 19: unassigned, reserved */
badtrap, /* 20: unassigned, reserved */
badtrap, /* 21: unassigned, reserved */
badtrap, /* 22: unassigned, reserved */
badtrap, /* 23: unassigned, reserved */
_isr_autovec, /* 24: spurious interrupt */
_isr_autovec, /* 25: level 1 interrupt autovector */
_isr_autovec, /* 26: level 2 interrupt autovector */
_isr_autovec, /* 27: level 3 interrupt autovector */
_isr_autovec, /* 28: level 4 interrupt autovector */
_isr_autovec, /* 29: level 5 interrupt autovector */
_isr_autovec, /* 30: level 6 interrupt autovector */
_isr_autovec, /* 31: level 7 interrupt autovector */
trap0, /* 32: syscalls (at least on hp300) */
trap1, /* 33: sigreturn syscall or breakpoi */
trap2, /* 34: breakpoint or sigreturn sysca */
illinst, /* 35: TRAP instruction vector */
illinst, /* 36: TRAP instruction vector */
illinst, /* 37: TRAP instruction vector */
illinst, /* 38: TRAP instruction vector */
illinst, /* 39: TRAP instruction vector */
illinst, /* 40: TRAP instruction vector */
illinst, /* 41: TRAP instruction vector */
illinst, /* 42: TRAP instruction vector */
illinst, /* 43: TRAP instruction vector */
trap12, /* 44: TRAP instruction vector */
illinst, /* 45: TRAP instruction vector */
illinst, /* 46: TRAP instruction vector */
trap15, /* 47: TRAP instruction vector */
fpbsun, /* 48: FPCP branch/set on unordered */
fpinex, /* 49: FPCP inexact result */
fpdz, /* 50: FPCP divide by zero */
fpunfl, /* 51: FPCP underflow */
fpoperr, /* 52: FPCP operand error */
fpovfl, /* 53: FPCP overflow */
fpsnan, /* 54: FPCP signalling NAN */
fpunsupp, /* 55: FPCP unimplemented data type */
badtrap, /* 56: unassigned, reserved */
badtrap, /* 57: unassigned, reserved */
badtrap, /* 58: unassigned, reserved */
badtrap, /* 59: unassigned, reserved */
badtrap, /* 60: unassigned, reserved */
badtrap, /* 61: unassigned, reserved */
badtrap, /* 62: unassigned, reserved */
badtrap, /* 63: unassigned, reserved */
/* 64-255: set later by isr_add_vectored() */
@ -129,22 +128,3 @@ void (*vector_table[NVECTORS])() = {
BADTRAP16, BADTRAP16, BADTRAP16, BADTRAP16,
BADTRAP16, BADTRAP16, BADTRAP16, BADTRAP16,
};
void set_vector_entry(entry, handler)
int entry;
void (*handler)();
{
if ((entry <0) || (entry >= NVECTORS))
panic("set_vector_entry: setting vector too high or low\n");
vector_table[entry] = handler;
}
unsigned int get_vector_entry(entry)
int entry;
{
if ((entry <0) || (entry >= NVECTORS))
panic("get_vector_entry: setting vector too high or low\n");
return (unsigned int) vector_table[entry];
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: vector.h,v 1.8 1994/12/12 19:00:11 gwr Exp $ */
/* $NetBSD: vector.h,v 1.9 1995/08/21 21:37:43 gwr Exp $ */
/*
* Copyright (c) 1993 Adam Glass
@ -31,12 +31,8 @@
* SUCH DAMAGE.
*/
#define COPY_ENTRY 0
#define NVECTORS 256
#define AUTO_VECTOR_BASE 0x18
#define AUTOVEC_BASE 0x18
extern void (*vector_table[])();
void set_vector_entry __P((int, void (*handler)()));
unsigned int get_vector_entry __P((int));