Unify splraiseipl(9) implementation among m68k ports as per
suggestion from isaki@ on port-m68k. For cesfic (compile test only): - use static splraise4() for splvm() and remove isrcomputeipl() for IPL_VM because this port supports only one model - make makeiplcookie(9) return PSL bits via ipl2psl_table[] rather than ipl indexes - make ipl2psl_table[] uint16_t rather than int
This commit is contained in:
parent
836c01beb6
commit
152476802f
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: autoconf.c,v 1.18 2007/12/03 15:33:24 ad Exp $ */
|
||||
/* $NetBSD: autoconf.c,v 1.19 2008/06/22 16:34:15 tsutsui Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1997, 1999
|
||||
@ -27,7 +27,7 @@
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.18 2007/12/03 15:33:24 ad Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.19 2008/06/22 16:34:15 tsutsui Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
@ -160,8 +160,6 @@ cpu_configure()
|
||||
|
||||
(void)spl0();
|
||||
cold = 0;
|
||||
|
||||
isrprintlevels();
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: isr.c,v 1.9 2008/05/03 23:17:03 martin Exp $ */
|
||||
/* $NetBSD: isr.c,v 1.10 2008/06/22 16:34:15 tsutsui Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1996 The NetBSD Foundation, Inc.
|
||||
@ -34,7 +34,7 @@
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: isr.c,v 1.9 2008/05/03 23:17:03 martin Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: isr.c,v 1.10 2008/06/22 16:34:15 tsutsui Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
@ -52,8 +52,6 @@ isr_list_t isr_list[NISR];
|
||||
|
||||
extern int intrcnt[]; /* from locore.s */
|
||||
|
||||
void isrcomputeipl __P((void));
|
||||
|
||||
void
|
||||
isrinit()
|
||||
{
|
||||
@ -65,78 +63,6 @@ isrinit()
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Scan all of the ISRs, recomputing the interrupt levels for the spl*()
|
||||
* calls. This doesn't have to be fast.
|
||||
*/
|
||||
void
|
||||
isrcomputeipl()
|
||||
{
|
||||
struct isr *isr;
|
||||
int ipl;
|
||||
int biospl, netspl, ttyspl, vmspl;
|
||||
|
||||
/* Start with low values. */
|
||||
biospl = netspl = ttyspl = vmspl = (PSL_S|PSL_IPL3);
|
||||
|
||||
for (ipl = 0; ipl < NISR; ipl++) {
|
||||
for (isr = isr_list[ipl].lh_first; isr != NULL;
|
||||
isr = isr->isr_link.le_next) {
|
||||
/*
|
||||
* Bump up the level for a given priority,
|
||||
* if necessary.
|
||||
*/
|
||||
switch (isr->isr_priority) {
|
||||
case ISRPRI_BIO:
|
||||
if (ipl > PSLTOIPL(biospl))
|
||||
biospl = IPLTOPSL(ipl);
|
||||
break;
|
||||
|
||||
case ISRPRI_NET:
|
||||
if (ipl > PSLTOIPL(netspl))
|
||||
netspl = IPLTOPSL(ipl);
|
||||
break;
|
||||
|
||||
case ISRPRI_TTY:
|
||||
case ISRPRI_TTYNOBUF:
|
||||
if (ipl > PSLTOIPL(ttyspl))
|
||||
ttyspl = IPLTOPSL(ipl);
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("priority = %d\n", isr->isr_priority);
|
||||
panic("isrcomputeipl: bad priority");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Enforce `bio <= net <= tty <= vm'
|
||||
*/
|
||||
|
||||
if (netspl < biospl)
|
||||
netspl = biospl;
|
||||
|
||||
if (ttyspl < netspl)
|
||||
ttyspl = netspl;
|
||||
|
||||
if (vmspl < ttyspl)
|
||||
vmspl = ttyspl;
|
||||
|
||||
ipl2spl_table[IPL_VM] = vmspl;
|
||||
}
|
||||
|
||||
void
|
||||
isrprintlevels()
|
||||
{
|
||||
|
||||
#ifdef DEBUG
|
||||
printf("psl: vm = 0x%x\n", ipl2spl_table[IPL_VM]);
|
||||
#endif
|
||||
|
||||
printf("interrupt levels: vm = %d\n", PSLTOIPL(ipl2spl_table[IPL_VM]));
|
||||
}
|
||||
|
||||
/*
|
||||
* Establish an interrupt handler.
|
||||
* Called by driver attach functions.
|
||||
@ -190,7 +116,7 @@ isrlink(func, arg, ipl, priority)
|
||||
list = &isr_list[ipl];
|
||||
if (list->lh_first == NULL) {
|
||||
LIST_INSERT_HEAD(list, newisr, isr_link);
|
||||
goto compute;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -202,7 +128,7 @@ isrlink(func, arg, ipl, priority)
|
||||
curisr = curisr->isr_link.le_next) {
|
||||
if (newisr->isr_priority > curisr->isr_priority) {
|
||||
LIST_INSERT_BEFORE(curisr, newisr, isr_link);
|
||||
goto compute;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
@ -212,9 +138,7 @@ isrlink(func, arg, ipl, priority)
|
||||
*/
|
||||
LIST_INSERT_AFTER(curisr, newisr, isr_link);
|
||||
|
||||
compute:
|
||||
/* Compute new interrupt levels. */
|
||||
isrcomputeipl();
|
||||
done:
|
||||
return (newisr);
|
||||
}
|
||||
|
||||
@ -230,7 +154,6 @@ isrunlink(arg)
|
||||
|
||||
LIST_REMOVE(isr, isr_link);
|
||||
free(isr, M_DEVBUF);
|
||||
isrcomputeipl();
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -292,13 +215,13 @@ cpu_intr_p(void)
|
||||
return idepth != 0;
|
||||
}
|
||||
|
||||
int ipl2spl_table[NIPL] = {
|
||||
[IPL_NONE] = PSL_S|PSL_IPL0,
|
||||
[IPL_SOFTCLOCK] = PSL_S|PSL_IPL1,
|
||||
[IPL_SOFTBIO] = PSL_S|PSL_IPL1,
|
||||
[IPL_SOFTNET] = PSL_S|PSL_IPL1,
|
||||
const uint16_t ipl2psl_table[NIPL] = {
|
||||
[IPL_NONE] = PSL_S|PSL_IPL0,
|
||||
[IPL_SOFTCLOCK] = PSL_S|PSL_IPL1,
|
||||
[IPL_SOFTBIO] = PSL_S|PSL_IPL1,
|
||||
[IPL_SOFTNET] = PSL_S|PSL_IPL1,
|
||||
[IPL_SOFTSERIAL] = PSL_S|PSL_IPL1,
|
||||
[IPL_VM] = PSL_S|PSL_IPL3,
|
||||
[IPL_SCHED] = PSL_S|PSL_IPL6,
|
||||
[IPL_HIGH] = PSL_S|PSL_IPL6,
|
||||
[IPL_VM] = PSL_S|PSL_IPL4,
|
||||
[IPL_SCHED] = PSL_S|PSL_IPL6,
|
||||
[IPL_HIGH] = PSL_S|PSL_IPL7,
|
||||
};
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: isr.h,v 1.2 2008/05/03 23:17:03 martin Exp $ */
|
||||
/* $NetBSD: isr.h,v 1.3 2008/06/22 16:34:15 tsutsui Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1996 The NetBSD Foundation, Inc.
|
||||
@ -67,4 +67,3 @@ void isrinit __P((void));
|
||||
void *isrlink __P((int (*)(void *), void *, int, int));
|
||||
void isrunlink __P((void *));
|
||||
void isrdispatch __P((int));
|
||||
void isrprintlevels __P((void));
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: intr.h,v 1.9 2007/12/03 15:33:26 ad Exp $ */
|
||||
/* $NetBSD: intr.h,v 1.10 2008/06/22 16:34:15 tsutsui Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1982, 1986, 1990, 1993
|
||||
@ -99,7 +99,7 @@
|
||||
#define splsoftbio() splraise1()
|
||||
#define splsoftnet() splraise1()
|
||||
#define splsoftserial() splraise1()
|
||||
#define splvm() _splraise(ipl2spl_table[IPL_VM])
|
||||
#define splvm() splraise4()
|
||||
#define splsched() spl6()
|
||||
#define splhigh() spl7()
|
||||
|
||||
@ -118,25 +118,25 @@ int spl0 __P((void));
|
||||
#define IPL_HIGH 7
|
||||
#define NIPL 8
|
||||
|
||||
extern int ipl2spl_table[NIPL];
|
||||
extern const uint16_t ipl2psl_table[NIPL];
|
||||
|
||||
typedef int ipl_t;
|
||||
typedef struct {
|
||||
uint16_t _ipl;
|
||||
uint16_t _psl;
|
||||
} ipl_cookie_t;
|
||||
|
||||
static inline ipl_cookie_t
|
||||
makeiplcookie(ipl_t ipl)
|
||||
{
|
||||
|
||||
return (ipl_cookie_t){._ipl = ipl};
|
||||
return (ipl_cookie_t){._psl = ipl2psl_table[ipl]};
|
||||
}
|
||||
|
||||
static inline int
|
||||
splraiseipl(ipl_cookie_t icookie)
|
||||
{
|
||||
|
||||
return _splraise(ipl2spl_table[icookie._ipl]);
|
||||
return _splraise(icookie._psl);
|
||||
}
|
||||
|
||||
#include <m68k/softintr.h>
|
||||
|
Loading…
Reference in New Issue
Block a user