From 152476802fe3a61469bc30a03edb0b504e27277f Mon Sep 17 00:00:00 2001 From: tsutsui Date: Sun, 22 Jun 2008 16:34:15 +0000 Subject: [PATCH] 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 --- sys/arch/cesfic/cesfic/autoconf.c | 6 +- sys/arch/cesfic/cesfic/isr.c | 103 ++++-------------------------- sys/arch/cesfic/cesfic/isr.h | 3 +- sys/arch/cesfic/include/intr.h | 12 ++-- 4 files changed, 22 insertions(+), 102 deletions(-) diff --git a/sys/arch/cesfic/cesfic/autoconf.c b/sys/arch/cesfic/cesfic/autoconf.c index 78a755bd6081..79d91a6dc0ed 100644 --- a/sys/arch/cesfic/cesfic/autoconf.c +++ b/sys/arch/cesfic/cesfic/autoconf.c @@ -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 -__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 #include @@ -160,8 +160,6 @@ cpu_configure() (void)spl0(); cold = 0; - - isrprintlevels(); } void diff --git a/sys/arch/cesfic/cesfic/isr.c b/sys/arch/cesfic/cesfic/isr.c index c35d4b7883a2..1940ce8d283d 100644 --- a/sys/arch/cesfic/cesfic/isr.c +++ b/sys/arch/cesfic/cesfic/isr.c @@ -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 -__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 #include @@ -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, }; diff --git a/sys/arch/cesfic/cesfic/isr.h b/sys/arch/cesfic/cesfic/isr.h index f1eae762bf9c..ac906df5c154 100644 --- a/sys/arch/cesfic/cesfic/isr.h +++ b/sys/arch/cesfic/cesfic/isr.h @@ -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)); diff --git a/sys/arch/cesfic/include/intr.h b/sys/arch/cesfic/include/intr.h index 8ba616521d46..3dd685f451de 100644 --- a/sys/arch/cesfic/include/intr.h +++ b/sys/arch/cesfic/include/intr.h @@ -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