From 9acd5bbb8daff7b8699ab0796f269f0d5d1bc788 Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Fri, 3 Jun 2005 17:14:51 +0000 Subject: [PATCH] Remove spl*() calls from i386, replacing them with critical sections. Leave spl support intact for the moment (it will be removed soon). Adjust the interrupt mux to use a critical section for 'old' interrupt handlers not using the new serialization API (which is nearly all of them at the moment). --- sys/config/GENERIC | 2 +- sys/cpu/i386/include/tls.h | 2 +- sys/i386/apm/apm.c | 24 +++--- sys/i386/conf/GENERIC | 2 +- sys/i386/gnu/isa/dgb.c | 101 +++++++++++------------- sys/i386/i386/busdma_machdep.c | 35 ++++---- sys/i386/i386/pmap.c | 71 +++++++---------- sys/i386/i386/sys_machdep.c | 9 +-- sys/i386/include/physio_proc.h | 14 ++-- sys/i386/include/tls.h | 2 +- sys/i386/isa/asc.c | 18 ++--- sys/i386/isa/ccbque.h | 13 +-- sys/i386/isa/clock.c | 13 ++- sys/i386/isa/intr_machdep.c | 29 +++---- sys/i386/isa/pmtimer.c | 13 ++- sys/platform/pc32/apm/apm.c | 24 +++--- sys/platform/pc32/gnu/isa/dgb.c | 101 +++++++++++------------- sys/platform/pc32/i386/busdma_machdep.c | 35 ++++---- sys/platform/pc32/i386/pmap.c | 71 +++++++---------- sys/platform/pc32/i386/sys_machdep.c | 9 +-- sys/platform/pc32/include/physio_proc.h | 14 ++-- sys/platform/pc32/isa/asc.c | 18 ++--- sys/platform/pc32/isa/clock.c | 13 ++- sys/platform/pc32/isa/intr_machdep.c | 29 +++---- sys/platform/pc32/isa/pmtimer.c | 13 ++- sys/sys/ccbque.h | 13 +-- 26 files changed, 310 insertions(+), 378 deletions(-) diff --git a/sys/config/GENERIC b/sys/config/GENERIC index 70b9043ca3..9b1ca46e67 100644 --- a/sys/config/GENERIC +++ b/sys/config/GENERIC @@ -4,7 +4,7 @@ # Check the LINT configuration file in sys/i386/conf, for an # exhaustive list of options. # -# $DragonFly: src/sys/config/GENERIC,v 1.23 2005/05/07 17:38:34 swildner Exp $ +# $DragonFly: src/sys/config/GENERIC,v 1.24 2005/06/03 17:14:46 dillon Exp $ machine i386 cpu I386_CPU diff --git a/sys/cpu/i386/include/tls.h b/sys/cpu/i386/include/tls.h index f59352a9fe..63b95e1151 100644 --- a/sys/cpu/i386/include/tls.h +++ b/sys/cpu/i386/include/tls.h @@ -28,7 +28,7 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $DragonFly: src/sys/cpu/i386/include/tls.h,v 1.6 2005/05/11 19:46:47 dillon Exp $ + * $DragonFly: src/sys/cpu/i386/include/tls.h,v 1.7 2005/06/03 17:14:50 dillon Exp $ */ #ifndef _MACHINE_TLS_H_ diff --git a/sys/i386/apm/apm.c b/sys/i386/apm/apm.c index 750fc59abc..69f22d7e17 100644 --- a/sys/i386/apm/apm.c +++ b/sys/i386/apm/apm.c @@ -16,7 +16,7 @@ * Sep, 1994 Implemented on FreeBSD 1.1.5.1R (Toshiba AVS001WD) * * $FreeBSD: src/sys/i386/apm/apm.c,v 1.114.2.5 2002/11/02 04:41:50 iwasaki Exp $ - * $DragonFly: src/sys/i386/apm/Attic/apm.c,v 1.10 2004/09/17 00:21:08 joerg Exp $ + * $DragonFly: src/sys/i386/apm/Attic/apm.c,v 1.11 2005/06/03 17:12:17 dillon Exp $ */ #include @@ -40,6 +40,7 @@ #include #include #include +#include #include #include @@ -322,12 +323,11 @@ apm_battery_low(void) static struct apmhook * apm_add_hook(struct apmhook **list, struct apmhook *ah) { - int s; struct apmhook *p, *prev; APM_DPRINT("Add hook \"%s\"\n", ah->ah_name); - s = splhigh(); + crit_enter(); if (ah == NULL) panic("illegal apm_hook!"); prev = NULL; @@ -342,17 +342,16 @@ apm_add_hook(struct apmhook **list, struct apmhook *ah) ah->ah_next = prev->ah_next; prev->ah_next = ah; } - splx(s); + crit_exit(); return ah; } static void apm_del_hook(struct apmhook **list, struct apmhook *ah) { - int s; struct apmhook *p, *prev; - s = splhigh(); + crit_enter(); prev = NULL; for (p = *list; p != NULL; prev = p, p = p->ah_next) if (p == ah) @@ -365,7 +364,7 @@ deleteit: else *list = p->ah_next; nosuchnode: - splx(s); + crit_exit(); } @@ -410,12 +409,11 @@ static struct timeval diff_time; static int apm_default_resume(void *arg) { - int pl; u_int second, minute, hour; struct timeval resume_time, tmp_time; /* modified for adjkerntz */ - pl = splsoftclock(); + crit_enter(); timer_restore(); /* restore the all timers */ inittodr(0); /* adjust time to RTC */ microtime(&resume_time); @@ -433,7 +431,7 @@ apm_default_resume(void *arg) /* Fixup the calltodo list with the delta time. */ adjust_timeout_calltodo(&resume_time); #endif /* APM_FIXUP_CALLTODOK */ - splx(pl); + crit_exit(); #ifndef APM_FIXUP_CALLTODO second = resume_time.tv_sec - suspend_time.tv_sec; #else /* APM_FIXUP_CALLTODO */ @@ -455,14 +453,12 @@ apm_default_resume(void *arg) static int apm_default_suspend(void *arg) { - int pl; - - pl = splsoftclock(); + crit_enter(); microtime(&diff_time); inittodr(0); microtime(&suspend_time); timevalsub(&diff_time, &suspend_time); - splx(pl); + crit_exit(); return 0; } diff --git a/sys/i386/conf/GENERIC b/sys/i386/conf/GENERIC index 1ff1756c10..89095986c0 100644 --- a/sys/i386/conf/GENERIC +++ b/sys/i386/conf/GENERIC @@ -4,7 +4,7 @@ # Check the LINT configuration file in sys/i386/conf, for an # exhaustive list of options. # -# $DragonFly: src/sys/i386/conf/Attic/GENERIC,v 1.23 2005/05/07 17:38:34 swildner Exp $ +# $DragonFly: src/sys/i386/conf/Attic/GENERIC,v 1.24 2005/06/03 17:14:46 dillon Exp $ machine i386 cpu I386_CPU diff --git a/sys/i386/gnu/isa/dgb.c b/sys/i386/gnu/isa/dgb.c index ae26bf5532..cea55186b9 100644 --- a/sys/i386/gnu/isa/dgb.c +++ b/sys/i386/gnu/isa/dgb.c @@ -1,6 +1,6 @@ /*- * dgb.c $FreeBSD: src/sys/gnu/i386/isa/dgb.c,v 1.56.2.1 2001/02/26 04:23:09 jlemon Exp $ - * dgb.c $DragonFly: src/sys/i386/gnu/isa/Attic/dgb.c,v 1.15 2005/01/31 23:44:35 joerg Exp $ + * dgb.c $DragonFly: src/sys/i386/gnu/isa/Attic/dgb.c,v 1.16 2005/06/03 17:14:47 dillon Exp $ * * Digiboard driver. * @@ -57,6 +57,7 @@ #include #include #include +#include #include @@ -943,7 +944,6 @@ dgbopen(dev_t dev, int flag, int mode, struct thread *td) int mynor; int pnum; struct dgb_p *port; - int s,cs; int error; volatile struct board_chan *bc; @@ -980,7 +980,7 @@ dgbopen(dev_t dev, int flag, int mode, struct thread *td) open_top: - s=spltty(); + crit_enter(); while(port->closing) { error=tsleep(&port->closing, PCATCH, "dgocl", 0); @@ -1016,7 +1016,7 @@ open_top: unit,pnum,error); goto out; } - splx(s); + crit_exit(); goto open_top; } } @@ -1039,7 +1039,7 @@ open_top: port->it_out : port->it_in; - cs=splclock(); + crit_enter(); setwin(sc,0); port->imodem=bc->mstat; bc->rout=bc->rin; /* clear input queue */ @@ -1049,7 +1049,7 @@ open_top: #endif hidewin(sc); - splx(cs); + crit_exit(); port->wopeners++; error=dgbparam(tp, &tp->t_termios); @@ -1080,7 +1080,7 @@ open_top: DPRINT4(DB_OPEN,"dgb%d: port%d: tsleep(dgdcd) error=%d\n",unit,pnum,error); goto out; } - splx(s); + crit_exit(); goto open_top; } error = linesw[tp->t_line].l_open(dev, tp); @@ -1098,7 +1098,7 @@ open_top: out: disc_optim(tp,&tp->t_termios); - splx(s); + crit_exit(); if( !(tp->t_state & TS_ISOPEN) && port->wopeners==0 ) dgbhardclose(port); @@ -1117,7 +1117,6 @@ dgbclose(dev_t dev, int flag, int mode, struct thread *td) struct dgb_softc *sc; struct dgb_p *port; int mynor; - int s; int i; mynor=minor(dev); @@ -1135,7 +1134,7 @@ dgbclose(dev_t dev, int flag, int mode, struct thread *td) DPRINT3(DB_CLOSE,"dgb%d: port%d: draining port\n",unit,pnum); dgb_drain_or_flush(port); - s=spltty(); + crit_enter(); port->closing=1; DPRINT3(DB_CLOSE,"dgb%d: port%d: closing line disc\n",unit,pnum); @@ -1156,7 +1155,7 @@ dgbclose(dev_t dev, int flag, int mode, struct thread *td) if(sc->ports[i].used) break; - splx(s); + crit_exit(); DPRINT3(DB_CLOSE,"dgb%d: port%d: closed\n",unit,pnum); @@ -1175,9 +1174,8 @@ dgbhardclose(port) { struct dgb_softc *sc=&dgb_softc[port->unit]; volatile struct board_chan *bc=port->brdchan; - int cs; - cs=splclock(); + crit_enter(); port->do_timestamp = 0; setwin(sc,0); @@ -1188,7 +1186,7 @@ dgbhardclose(port) } hidewin(sc); - splx(cs); + crit_exit(); callout_reset(&sc->dgb_pause, hz / 2, dgb_pause, &port->brdchan); tsleep(&port->brdchan, PCATCH, "dgclo", 0); @@ -1372,7 +1370,6 @@ dgbpoll(unit_c) int wrapmask=port->txbufsize-1; for(obuf_full=FALSE; tp->t_outq.c_cc!=0 && !obuf_full; ) { - int s; /* add "last-minute" data to write buffer */ if(!(tp->t_state & TS_BUSY)) { hidewin(sc); @@ -1389,7 +1386,7 @@ dgbpoll(unit_c) #endif setwin(sc,0); } - s=spltty(); + crit_enter(); whead=bc->tin & wrapmask; wtail=bc->tout & wrapmask; @@ -1407,7 +1404,7 @@ dgbpoll(unit_c) whead,wtail,size,obuf_full); bc->iempty=1; bc->ilow=1; obuf_full=TRUE; - splx(s); + crit_exit(); break; } @@ -1419,7 +1416,7 @@ dgbpoll(unit_c) setwin(sc,0); bc->tin=whead; bc->tin=whead & wrapmask; - splx(s); + crit_exit(); } if(obuf_full) { @@ -1475,7 +1472,6 @@ dgbioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) struct tty *tp; volatile struct board_chan *bc; int error; - int s,cs; int tiocm_xxx; #if defined(COMPAT_43) || defined(COMPAT_SUNOS) @@ -1566,18 +1562,18 @@ dgbioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) } if(cmd==TIOCSTOP) { - cs=splclock(); + crit_enter(); setwin(sc,0); fepcmd(port, PAUSETX, 0, 0, 0, 0); bmws_set(ws); - splx(cs); + crit_exit(); return 0; } else if(cmd==TIOCSTART) { - cs=splclock(); + crit_enter(); setwin(sc,0); fepcmd(port, RESUMETX, 0, 0, 0, 0); bmws_set(ws); - splx(cs); + crit_exit(); return 0; } @@ -1587,12 +1583,12 @@ dgbioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) error = linesw[tp->t_line].l_ioctl(tp, cmd, data, flag, td); if (error != ENOIOCTL) return error; - s = spltty(); + crit_enter(); error = ttioctl(tp, cmd, data, flag); disc_optim(tp,&tp->t_termios); port->mustdrain=0; if (error != ENOIOCTL) { - splx(s); + crit_exit(); if (cmd == TIOCSETA || cmd == TIOCSETAW || cmd == TIOCSETAF) { DPRINT6(DB_PARAM,"dgb%d: port%d: dgbioctl-RES c=0x%x i=0x%x l=0x%x\n",unit,pnum,tp->t_cflag,tp->t_iflag,tp->t_lflag); } @@ -1605,11 +1601,11 @@ dgbioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) /* error=dgbdrain(port);*/ if(error!=0) { - splx(s); + crit_exit(); return error; } - cs=splclock(); + crit_enter(); setwin(sc,0); /* now it sends 250 millisecond break because I don't know */ @@ -1617,7 +1613,7 @@ dgbioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) fepcmd(port, SENDBREAK, 250, 0, 10, 0); hidewin(sc); - splx(cs); + crit_exit(); break; case TIOCCBRK: /* now it's empty */ @@ -1625,7 +1621,7 @@ dgbioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) case TIOCSDTR: DPRINT3(DB_MODEM,"dgb%d: port%d: set DTR\n",unit,pnum); port->omodem |= DTR; - cs=splclock(); + crit_enter(); setwin(sc,0); fepcmd(port, SETMODEM, port->omodem, RTS, 0, 1); @@ -1634,12 +1630,12 @@ dgbioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) } hidewin(sc); - splx(cs); + crit_exit(); break; case TIOCCDTR: DPRINT3(DB_MODEM,"dgb%d: port%d: reset DTR\n",unit,pnum); port->omodem &= ~DTR; - cs=splclock(); + crit_enter(); setwin(sc,0); fepcmd(port, SETMODEM, port->omodem, RTS|DTR, 0, 1); @@ -1648,7 +1644,7 @@ dgbioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) } hidewin(sc); - splx(cs); + crit_exit(); break; case TIOCMSET: if(*(int *)data & TIOCM_DTR) @@ -1661,11 +1657,11 @@ dgbioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) else port->omodem &=~RTS; - cs=splclock(); + crit_enter(); setwin(sc,0); fepcmd(port, SETMODEM, port->omodem, RTS|DTR, 0, 1); hidewin(sc); - splx(cs); + crit_exit(); break; case TIOCMBIS: if(*(int *)data & TIOCM_DTR) @@ -1674,11 +1670,11 @@ dgbioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) if(*(int *)data & TIOCM_RTS) port->omodem |=RTS; - cs=splclock(); + crit_enter(); setwin(sc,0); fepcmd(port, SETMODEM, port->omodem, RTS|DTR, 0, 1); hidewin(sc); - splx(cs); + crit_exit(); break; case TIOCMBIC: if(*(int *)data & TIOCM_DTR) @@ -1687,11 +1683,11 @@ dgbioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) if(*(int *)data & TIOCM_RTS) port->omodem &=~RTS; - cs=splclock(); + crit_enter(); setwin(sc,0); fepcmd(port, SETMODEM, port->omodem, RTS|DTR, 0, 1); hidewin(sc); - splx(cs); + crit_exit(); break; case TIOCMGET: setwin(sc,0); @@ -1733,7 +1729,7 @@ dgbioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) /* must be root since the wait applies to following logins */ error = suser(td); if (error != 0) { - splx(s); + crit_exit(); return (error); } port->close_delay = *(int *)data * hz / 100; @@ -1751,11 +1747,11 @@ dgbioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) break; default: bmws_set(ws); - splx(s); + crit_exit(); return ENOTTY; } bmws_set(ws); - splx(s); + crit_exit(); return 0; } @@ -1893,7 +1889,6 @@ dgbparam(tp, t) int mval; int iflag; int hflow; - int cs; BoardMemWinState ws=bmws_get(); @@ -1914,7 +1909,7 @@ dgbparam(tp, t) return (EINVAL); } - cs=splclock(); + crit_enter(); setwin(sc,0); if(cflag==0) { /* hangup */ @@ -1967,7 +1962,7 @@ dgbparam(tp, t) } bmws_set(ws); - splx(cs); + crit_exit(); return 0; @@ -1984,7 +1979,6 @@ dgbstart(tp) volatile struct board_chan *bc; int head, tail; int size, ocount; - int s; int wmask; BoardMemWinState ws=bmws_get(); @@ -1997,7 +1991,7 @@ dgbstart(tp) wmask=port->txbufsize-1; - s=spltty(); + crit_enter(); while( tp->t_outq.c_cc!=0 ) { int cs; @@ -2012,7 +2006,7 @@ dgbstart(tp) /*selwakeup(&tp->t_wsel);*/ } #endif - cs=splclock(); + crit_exit(); setwin(sc,0); head=bc->tin & wmask; @@ -2045,10 +2039,10 @@ dgbstart(tp) if(size==0) { bc->iempty=1; bc->ilow=1; - splx(cs); + crit_exit(); bmws_set(ws); tp->t_state|=TS_BUSY; - splx(s); + crit_exit(); return; } @@ -2064,11 +2058,11 @@ dgbstart(tp) DPRINT5(DB_WR,"dgb%d: port%d: tx avail=%d count=%d\n",unit,pnum,size,ocount); hidewin(sc); - splx(cs); + crit_exit(); } bmws_set(ws); - splx(s); + crit_exit(); #ifndef TS_ASLEEP /* post 2.0.5 FreeBSD */ if(tp->t_state & TS_BUSY) { @@ -2095,7 +2089,6 @@ dgbstop(tp, rw) struct dgb_p *port; struct dgb_softc *sc; volatile struct board_chan *bc; - int s; BoardMemWinState ws=bmws_get(); @@ -2108,7 +2101,7 @@ dgbstop(tp, rw) DPRINT3(DB_WR,"dgb%d: port%d: stop\n",port->unit, port->pnum); - s = spltty(); + crit_enter(); setwin(sc,0); if (rw & FWRITE) { @@ -2123,7 +2116,7 @@ dgbstop(tp, rw) } hidewin(sc); bmws_set(ws); - splx(s); + crit_exit(); dgbstart(tp); } diff --git a/sys/i386/i386/busdma_machdep.c b/sys/i386/i386/busdma_machdep.c index dcf7740450..debd9b02d4 100644 --- a/sys/i386/i386/busdma_machdep.c +++ b/sys/i386/i386/busdma_machdep.c @@ -24,7 +24,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/i386/i386/busdma_machdep.c,v 1.16.2.2 2003/01/23 00:55:27 scottl Exp $ - * $DragonFly: src/sys/i386/i386/Attic/busdma_machdep.c,v 1.12 2005/01/18 14:02:05 joerg Exp $ + * $DragonFly: src/sys/i386/i386/Attic/busdma_machdep.c,v 1.13 2005/06/03 17:14:48 dillon Exp $ */ #include @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -451,9 +452,7 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, /* Reserve Necessary Bounce Pages */ if (map->pagesneeded != 0) { - int s; - - s = splhigh(); + crit_enter(); if (reserve_bounce_pages(dmat, map) != 0) { /* Queue us for resources */ @@ -464,11 +463,11 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, map->callback_arg = callback_arg; STAILQ_INSERT_TAIL(&bounce_map_waitinglist, map, links); - splx(s); + crit_exit(); return (EINPROGRESS); } - splx(s); + crit_exit(); } vaddr = (vm_offset_t)buf; @@ -780,7 +779,6 @@ alloc_bounce_pages(bus_dma_tag_t dmat, u_int numpages) while (numpages > 0) { struct bounce_page *bpage; - int s; bpage = (struct bounce_page *)malloc(sizeof(*bpage), M_DEVBUF, M_INTWAIT); @@ -798,11 +796,11 @@ alloc_bounce_pages(bus_dma_tag_t dmat, u_int numpages) break; } bpage->busaddr = pmap_kextract(bpage->vaddr); - s = splhigh(); + crit_enter(); STAILQ_INSERT_TAIL(&bounce_page_list, bpage, links); total_bpages++; free_bpages++; - splx(s); + crit_exit(); count++; numpages--; } @@ -827,7 +825,6 @@ static bus_addr_t add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr, bus_size_t size) { - int s; struct bounce_page *bpage; if (map->pagesneeded == 0) @@ -838,7 +835,7 @@ add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr, panic("add_bounce_page: map doesn't need any pages"); map->pagesreserved--; - s = splhigh(); + crit_enter(); bpage = STAILQ_FIRST(&bounce_page_list); if (bpage == NULL) panic("add_bounce_page: free page list is empty"); @@ -846,7 +843,7 @@ add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr, STAILQ_REMOVE_HEAD(&bounce_page_list, links); reserved_bpages--; active_bpages++; - splx(s); + crit_exit(); bpage->datavaddr = vaddr; bpage->datacount = size; @@ -857,13 +854,12 @@ add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr, static void free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage) { - int s; struct bus_dmamap *map; bpage->datavaddr = 0; bpage->datacount = 0; - s = splhigh(); + crit_enter(); STAILQ_INSERT_HEAD(&bounce_page_list, bpage, links); free_bpages++; active_bpages--; @@ -876,22 +872,21 @@ free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage) setsoftvm(); } } - splx(s); + crit_exit(); } void busdma_swi() { - int s; struct bus_dmamap *map; - s = splhigh(); + crit_enter(); while ((map = STAILQ_FIRST(&bounce_map_callbacklist)) != NULL) { STAILQ_REMOVE_HEAD(&bounce_map_callbacklist, links); - splx(s); + crit_exit(); bus_dmamap_load(map->dmat, map, map->buf, map->buflen, map->callback, map->callback_arg, /*flags*/0); - s = splhigh(); + crit_enter(); } - splx(s); + crit_exit(); } diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c index c6deedf178..803e80b5ba 100644 --- a/sys/i386/i386/pmap.c +++ b/sys/i386/i386/pmap.c @@ -40,7 +40,7 @@ * * from: @(#)pmap.c 7.7 (Berkeley) 5/12/91 * $FreeBSD: src/sys/i386/i386/pmap.c,v 1.250.2.18 2002/03/06 22:48:53 silby Exp $ - * $DragonFly: src/sys/i386/i386/Attic/pmap.c,v 1.47 2004/10/12 19:29:26 dillon Exp $ + * $DragonFly: src/sys/i386/i386/Attic/pmap.c,v 1.48 2005/06/03 17:14:48 dillon Exp $ */ /* @@ -268,8 +268,7 @@ pmap_pte(pmap_t pmap, vm_offset_t va) * the pv list scans are across different pmaps and it is very wasteful * to do an entire invltlb when checking a single mapping. * - * Should only be called while splvm() is held or from a critical - * section. + * Should only be called while in a critical section. */ static unsigned * pmap_pte_quick(pmap_t pmap, vm_offset_t va) @@ -1341,7 +1340,6 @@ pmap_release(struct pmap *pmap) vm_page_t p,n,ptdpg; vm_object_t object = pmap->pm_pteobj; int curgeneration; - int s; #if defined(DIAGNOSTIC) if (object->ref_count != 1) @@ -1350,7 +1348,7 @@ pmap_release(struct pmap *pmap) ptdpg = NULL; retry: - s = splvm(); + crit_enter(); curgeneration = object->generation; for (p = TAILQ_FIRST(&object->memq); p != NULL; p = n) { n = TAILQ_NEXT(p, listq); @@ -1361,12 +1359,12 @@ retry: while (1) { if (!pmap_release_free_page(pmap, p) && (object->generation != curgeneration)) { - splx(s); + crit_exit(); goto retry; } } } - splx(s); + crit_exit(); if (ptdpg && !pmap_release_free_page(pmap, ptdpg)) goto retry; @@ -1400,12 +1398,11 @@ pmap_growkernel(vm_offset_t addr) { struct proc *p; struct pmap *pmap; - int s; vm_offset_t ptppaddr; vm_page_t nkpg; pd_entry_t newpdir; - s = splhigh(); + crit_enter(); if (kernel_vm_end == 0) { kernel_vm_end = KERNBASE; nkpt = 0; @@ -1446,7 +1443,7 @@ pmap_growkernel(vm_offset_t addr) *pmap_pde(kernel_pmap, kernel_vm_end) = newpdir; kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1); } - splx(s); + crit_exit(); } /* @@ -1554,9 +1551,8 @@ pmap_remove_entry(struct pmap *pmap, vm_page_t m, { pv_entry_t pv; int rtval; - int s; - s = splvm(); + crit_enter(); if (m->md.pv_list_count < pmap->pm_stats.resident_count) { TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) { if (pmap == pv->pv_pmap && va == pv->pv_va) @@ -1579,7 +1575,7 @@ pmap_remove_entry(struct pmap *pmap, vm_page_t m, TAILQ_REMOVE(&pmap->pm_pvlist, pv, pv_plist); free_pv_entry(pv); } - splx(s); + crit_exit(); return rtval; } @@ -1590,10 +1586,9 @@ pmap_remove_entry(struct pmap *pmap, vm_page_t m, static void pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t mpte, vm_page_t m) { - int s; pv_entry_t pv; - s = splvm(); + crit_enter(); pv = get_pv_entry(); pv->pv_va = va; pv->pv_pmap = pmap; @@ -1603,7 +1598,7 @@ pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t mpte, vm_page_t m) TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list); m->md.pv_list_count++; - splx(s); + crit_exit(); } /* @@ -1786,7 +1781,6 @@ pmap_remove_all(vm_page_t m) struct pmap_inval_info info; unsigned *pte, tpte; pv_entry_t pv; - int s; #if defined(PMAP_DIAGNOSTIC) /* @@ -1799,7 +1793,7 @@ pmap_remove_all(vm_page_t m) #endif pmap_inval_init(&info); - s = splvm(); + crit_enter(); while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) { pv->pv_pmap->pm_stats.resident_count--; @@ -1835,7 +1829,7 @@ pmap_remove_all(vm_page_t m) } vm_page_flag_clear(m, PG_MAPPED | PG_WRITEABLE); - splx(s); + crit_exit(); pmap_inval_flush(&info); } @@ -2317,8 +2311,8 @@ retry: * If we are processing a major portion of the object, then scan the * entire thing. * - * We cannot safely scan the object's memq unless we are at splvm(), - * since interrupts can remove pages from objects. + * We cannot safely scan the object's memq unless we are in a + * critical section since interrupts can remove pages from objects. */ crit_enter(); mpte = NULL; @@ -2426,9 +2420,9 @@ pmap_prefault(pmap_t pmap, vm_offset_t addra, vm_map_entry_t entry) starta = 0; /* - * splvm() protection is required to maintain the page/object - * association, interrupts can free pages and remove them from - * their objects. + * critical section protection is required to maintain the + * page/object association, interrupts can free pages and remove + * them from their objects. */ mpte = NULL; crit_enter(); @@ -2828,23 +2822,22 @@ pmap_page_exists_quick(pmap_t pmap, vm_page_t m) { pv_entry_t pv; int loops = 0; - int s; if (!pmap_initialized || (m->flags & PG_FICTITIOUS)) return FALSE; - s = splvm(); + crit_enter(); TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) { if (pv->pv_pmap == pmap) { - splx(s); + crit_exit(); return TRUE; } loops++; if (loops >= 16) break; } - splx(s); + crit_exit(); return (FALSE); } @@ -2862,7 +2855,6 @@ pmap_remove_pages(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) { unsigned *pte, tpte; pv_entry_t pv, npv; - int s; vm_page_t m; pmap_inval_info info; @@ -2874,7 +2866,7 @@ pmap_remove_pages(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) #endif pmap_inval_init(&info); - s = splvm(); + crit_enter(); for(pv = TAILQ_FIRST(&pmap->pm_pvlist); pv; pv = npv) { @@ -2929,7 +2921,7 @@ pmap_remove_pages(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) free_pv_entry(pv); } pmap_inval_flush(&info); - splx(s); + crit_exit(); } /* @@ -2942,7 +2934,6 @@ pmap_testbit(vm_page_t m, int bit) { pv_entry_t pv; unsigned *pte; - int s; if (!pmap_initialized || (m->flags & PG_FICTITIOUS)) return FALSE; @@ -2950,7 +2941,7 @@ pmap_testbit(vm_page_t m, int bit) if (TAILQ_FIRST(&m->md.pv_list) == NULL) return FALSE; - s = splvm(); + crit_enter(); TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) { /* @@ -2971,11 +2962,11 @@ pmap_testbit(vm_page_t m, int bit) #endif pte = pmap_pte_quick(pv->pv_pmap, pv->pv_va); if (*pte & bit) { - splx(s); + crit_exit(); return TRUE; } } - splx(s); + crit_exit(); return (FALSE); } @@ -2988,13 +2979,12 @@ pmap_changebit(vm_page_t m, int bit, boolean_t setem) struct pmap_inval_info info; pv_entry_t pv; unsigned *pte; - int s; if (!pmap_initialized || (m->flags & PG_FICTITIOUS)) return; pmap_inval_init(&info); - s = splvm(); + crit_enter(); /* * Loop over all current mappings setting/clearing as appropos If @@ -3054,7 +3044,7 @@ pmap_changebit(vm_page_t m, int bit, boolean_t setem) } } pmap_inval_flush(&info); - splx(s); + crit_exit(); } /* @@ -3097,13 +3087,12 @@ pmap_ts_referenced(vm_page_t m) { pv_entry_t pv, pvf, pvn; unsigned *pte; - int s; int rtval = 0; if (!pmap_initialized || (m->flags & PG_FICTITIOUS)) return (rtval); - s = splvm(); + crit_enter(); if ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) { @@ -3134,7 +3123,7 @@ pmap_ts_referenced(vm_page_t m) } } while ((pv = pvn) != NULL && pv != pvf); } - splx(s); + crit_exit(); return (rtval); } diff --git a/sys/i386/i386/sys_machdep.c b/sys/i386/i386/sys_machdep.c index b03e1a387c..6aeb0d8d29 100644 --- a/sys/i386/i386/sys_machdep.c +++ b/sys/i386/i386/sys_machdep.c @@ -32,7 +32,7 @@ * * from: @(#)sys_machdep.c 5.5 (Berkeley) 1/19/91 * $FreeBSD: src/sys/i386/i386/sys_machdep.c,v 1.47.2.3 2002/10/07 17:20:00 jhb Exp $ - * $DragonFly: src/sys/i386/i386/Attic/sys_machdep.c,v 1.17 2005/05/23 18:23:29 dillon Exp $ + * $DragonFly: src/sys/i386/i386/Attic/sys_machdep.c,v 1.18 2005/06/03 17:14:48 dillon Exp $ * */ @@ -344,7 +344,6 @@ i386_get_ldt(struct proc *p, char *args, int *res) struct pcb_ldt *pcb_ldt = pcb->pcb_ldt; unsigned int nldt, num; union descriptor *lp; - int s; struct i386_ldt_args ua, *uap = &ua; if ((error = copyin(args, uap, sizeof(struct i386_ldt_args))) < 0) @@ -355,7 +354,7 @@ i386_get_ldt(struct proc *p, char *args, int *res) uap->start, uap->num, (void *)uap->descs); #endif - s = splhigh(); + crit_enter(); if (pcb_ldt) { nldt = (unsigned int)pcb_ldt->ldt_len; @@ -372,14 +371,14 @@ i386_get_ldt(struct proc *p, char *args, int *res) * are limited in scope, but uap->start can be anything. */ if (uap->start > nldt || uap->start + num > nldt) { - splx(s); + crit_exit(); return(EINVAL); } error = copyout(lp, uap->descs, num * sizeof(union descriptor)); if (!error) *res = num; - splx(s); + crit_exit(); return(error); } diff --git a/sys/i386/include/physio_proc.h b/sys/i386/include/physio_proc.h index 18409a0f31..fe7bd6be3a 100644 --- a/sys/i386/include/physio_proc.h +++ b/sys/i386/include/physio_proc.h @@ -1,5 +1,5 @@ /* $FreeBSD: src/sys/i386/include/physio_proc.h,v 1.1.2.1 2000/10/29 11:05:48 non Exp $ */ -/* $DragonFly: src/sys/i386/include/Attic/physio_proc.h,v 1.9 2004/08/10 16:03:12 eirikn Exp $ */ +/* $DragonFly: src/sys/i386/include/Attic/physio_proc.h,v 1.10 2005/06/03 17:14:50 dillon Exp $ */ /* $NecBSD: physio_proc.h,v 3.4 1999/07/23 20:47:03 honda Exp $ */ /* $NetBSD$ */ @@ -36,6 +36,7 @@ #include #include +#include struct physio_proc; TAILQ_HEAD(physio_proc_head, physio_proc); @@ -54,21 +55,20 @@ physio_proc_enter(bp) struct buf *bp; { struct physio_proc *pp; - int s; if (bp == NULL || (bp->b_flags & B_PHYS) == 0) return NULL; if ((pp = TAILQ_FIRST(&physio_proc_freet)) == NULL) return NULL; - s = splstatclock(); + crit_enter(); TAILQ_REMOVE(&physio_proc_freet, pp, pp_chain); #if !(defined(__DragonFly__) || defined(__FreeBSD__)) || \ (defined(__FreeBSD_version) && __FreeBSD_version < 400001) pp->pp_proc = bp->b_proc; #endif TAILQ_INSERT_TAIL(&physio_proc_busyt, pp, pp_chain); - splx(s); + crit_exit(); return pp; } @@ -76,16 +76,14 @@ static __inline void physio_proc_leave(pp) struct physio_proc *pp; { - int s; - if (pp == NULL) return; - s = splstatclock(); + crit_enter(); TAILQ_REMOVE(&physio_proc_busyt, pp, pp_chain); TAILQ_INSERT_TAIL(&physio_proc_freet, pp, pp_chain); pp->pp_proc = NULL; - splx(s); + crit_exit(); } void physio_proc_init (void); diff --git a/sys/i386/include/tls.h b/sys/i386/include/tls.h index 0601dac246..52a32ba503 100644 --- a/sys/i386/include/tls.h +++ b/sys/i386/include/tls.h @@ -28,7 +28,7 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $DragonFly: src/sys/i386/include/Attic/tls.h,v 1.6 2005/05/11 19:46:47 dillon Exp $ + * $DragonFly: src/sys/i386/include/Attic/tls.h,v 1.7 2005/06/03 17:14:50 dillon Exp $ */ #ifndef _MACHINE_TLS_H_ diff --git a/sys/i386/isa/asc.c b/sys/i386/isa/asc.c index 5265f0a315..ba36f0aa7b 100644 --- a/sys/i386/isa/asc.c +++ b/sys/i386/isa/asc.c @@ -35,7 +35,7 @@ */ /* * $FreeBSD: src/sys/i386/isa/asc.c,v 1.42.2.2 2001/03/01 03:22:39 jlemon Exp $ - * $DragonFly: src/sys/i386/isa/Attic/asc.c,v 1.8 2004/05/19 22:52:57 dillon Exp $ + * $DragonFly: src/sys/i386/isa/Attic/asc.c,v 1.9 2005/06/03 17:14:51 dillon Exp $ */ #include "use_asc.h" @@ -49,6 +49,7 @@ #include #include #include +#include #include @@ -699,7 +700,7 @@ ascread(dev_t dev, struct uio *uio, int ioflag) int unit = UNIT(minor(dev)); struct asc_unit *scu = unittab + unit; size_t nbytes; - int sps, res; + int res; unsigned char *p; lprintf("asc%d.read: minor %d icnt %ld\n", unit, minor(dev), scu->icnt); @@ -726,7 +727,7 @@ ascread(dev_t dev, struct uio *uio, int ioflag) scu->sbuf.wptr, scu->sbuf.count, scu->bcount,scu->flags, scu->icnt); - sps=spltty(); + crit_enter(); if ( scu->sbuf.count == 0 ) { /* no data avail., must wait */ if (!(scu->flags & DMA_ACTIVE)) dma_restart(scu); scu->flags |= SLEEPING; @@ -734,7 +735,7 @@ ascread(dev_t dev, struct uio *uio, int ioflag) scu->flags &= ~SLEEPING; if ( res == 0 ) res = SUCCESS; } - splx(sps); /* lower priority... */ + crit_exit(); if (scu->flags & FLAG_DEBUG) tsleep((caddr_t)scu, PCATCH, "ascdly",hz); lprintf("asc%d.read(after): " @@ -762,13 +763,13 @@ ascread(dev_t dev, struct uio *uio, int ioflag) return res; } - sps=spltty(); + crit_enter(); scu->sbuf.rptr += nbytes; if (scu->sbuf.rptr >= scu->sbuf.size) scu->sbuf.rptr=0; scu->sbuf.count -= nbytes; /* having moved some data, can read mode */ if (!(scu->flags & DMA_ACTIVE)) dma_restart(scu); - splx(sps); /* lower priority... */ + crit_exit(); if ( scu->flags & PBM_MODE ) scu->bcount -= nbytes; lprintf("asc%d.read: size 0x%x, pointer 0x%x, bcount 0x%x, ok\n", @@ -852,7 +853,6 @@ ascpoll(dev_t dev, int events, struct thread *td) { int unit = UNIT(minor(dev)); struct asc_unit *scu = unittab + unit; - int sps; struct proc *p; struct proc *p1; int revents = 0; @@ -860,7 +860,7 @@ ascpoll(dev_t dev, int events, struct thread *td) p = td->td_proc; KKASSERT(p); - sps=spltty(); + crit_enter(); if (events & (POLLIN | POLLRDNORM)) { if (scu->sbuf.count >0) @@ -876,6 +876,6 @@ ascpoll(dev_t dev, int events, struct thread *td) scu->selp.si_pid = p->p_pid; } } - splx(sps); + crit_exit(); return (revents); } diff --git a/sys/i386/isa/ccbque.h b/sys/i386/isa/ccbque.h index efaf59ef9d..635caf9d70 100644 --- a/sys/i386/isa/ccbque.h +++ b/sys/i386/isa/ccbque.h @@ -28,7 +28,7 @@ * POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/i386/isa/ccbque.h,v 1.3.6.2 2000/10/21 07:44:24 nyan Exp $ - * $DragonFly: src/sys/i386/isa/Attic/ccbque.h,v 1.6 2004/10/14 03:05:54 dillon Exp $ + * $DragonFly: src/sys/i386/isa/Attic/ccbque.h,v 1.7 2005/06/03 17:14:51 dillon Exp $ */ /* * Common command control queue funcs. @@ -73,8 +73,9 @@ DEV##_init_ccbque(count) \ struct CCBTYPE * \ DEV##_get_ccb() \ { \ - struct CCBTYPE *cb; \ - int s = splcam(); \ + struct CCBTYPE *cb; \ + \ + crit_enter(); \ \ if (CCBTYPE##que.count < CCBTYPE##que.maxccb) \ { \ @@ -100,7 +101,7 @@ DEV##_get_ccb() \ cb = NULL; \ \ out: \ - splx(s); \ + crit_exit(); \ return cb; \ } \ \ @@ -108,7 +109,7 @@ void \ DEV##_free_ccb(cb) \ struct CCBTYPE *cb; \ { \ - int s = splcam(); \ + crit_enter(); \ \ TAILQ_INSERT_TAIL(&CCBTYPE##que.CCBTYPE##tab, cb, CHAIN); \ CCBTYPE##que.count --; \ @@ -118,6 +119,6 @@ DEV##_free_ccb(cb) \ CCBTYPE##que.flags &= ~CCB_MWANTED; \ wakeup ((caddr_t) &CCBTYPE##que.count); \ } \ - splx(s); \ + crit_exit(); \ } #endif /* !_CCBQUE_H_ */ diff --git a/sys/i386/isa/clock.c b/sys/i386/isa/clock.c index 5c9a2918bd..c9a6fb9d97 100644 --- a/sys/i386/isa/clock.c +++ b/sys/i386/isa/clock.c @@ -35,7 +35,7 @@ * * from: @(#)clock.c 7.2 (Berkeley) 5/12/91 * $FreeBSD: src/sys/i386/isa/clock.c,v 1.149.2.6 2002/11/02 04:41:50 iwasaki Exp $ - * $DragonFly: src/sys/i386/isa/Attic/clock.c,v 1.27 2005/06/01 22:55:19 dillon Exp $ + * $DragonFly: src/sys/i386/isa/Attic/clock.c,v 1.28 2005/06/03 17:14:51 dillon Exp $ */ /* @@ -463,30 +463,27 @@ int rtcin(reg) int reg; { - int s; u_char val; - s = splhigh(); + crit_enter(); outb(IO_RTC, reg); inb(0x84); val = inb(IO_RTC + 1); inb(0x84); - splx(s); + crit_exit(); return (val); } static __inline void writertc(u_char reg, u_char val) { - int s; - - s = splhigh(); + crit_enter(); inb(0x84); outb(IO_RTC, reg); inb(0x84); outb(IO_RTC + 1, val); inb(0x84); /* XXX work around wrong order in rtcin() */ - splx(s); + crit_exit(); } static __inline int diff --git a/sys/i386/isa/intr_machdep.c b/sys/i386/isa/intr_machdep.c index 719895cad7..a0aedf4e99 100644 --- a/sys/i386/isa/intr_machdep.c +++ b/sys/i386/isa/intr_machdep.c @@ -35,7 +35,7 @@ * * from: @(#)isa.c 7.2 (Berkeley) 5/13/91 * $FreeBSD: src/sys/i386/isa/intr_machdep.c,v 1.29.2.5 2001/10/14 06:54:27 luigi Exp $ - * $DragonFly: src/sys/i386/isa/Attic/intr_machdep.c,v 1.28 2005/05/25 07:58:41 dillon Exp $ + * $DragonFly: src/sys/i386/isa/Attic/intr_machdep.c,v 1.29 2005/06/03 17:14:51 dillon Exp $ */ /* * This file contains an aggregated module marked: @@ -640,20 +640,25 @@ intr_mux(void *arg) { intrec **pp; intrec *p; - intrmask_t oldspl; for (pp = arg; (p = *pp) != NULL; pp = &p->next) { if (p->serializer) { /* - * New handler dispatch method. Note that this + * New handler dispatch method. Only the serializer + * is used to interlock access. Note that this * API includes a handler disablement feature. */ lwkt_serialize_handler_call(p->serializer, p->handler, p->argument); } else { - oldspl = splq(p->mask); + /* + * Old handlers may expect multiple interrupt + * sources to be masked. We must use a critical + * section. + */ + crit_enter(); p->handler(p->argument); - splx(oldspl); + crit_exit(); } } } @@ -840,7 +845,6 @@ inthand_add(const char *name, int irq, inthand2_t handler, void *arg, { intrec *idesc; int errcode = -1; - intrmask_t oldspl; if (ICU_LEN > 8 * sizeof *maskptr) { printf("create_intr: ICU_LEN of %d too high for %d bit intrmask\n", @@ -873,12 +877,10 @@ inthand_add(const char *name, int irq, inthand2_t handler, void *arg, idesc->flags = flags; idesc->serializer = serializer; - /* block this irq */ - oldspl = splq(1 << irq); - /* add irq to class selected by maskptr */ + crit_enter(); errcode = add_intrdesc(idesc); - splx(oldspl); + crit_exit(); if (errcode != 0) { if (bootverbose) @@ -904,14 +906,13 @@ int inthand_remove(intrec *idesc) { intrec **hook, *head; - intrmask_t oldspl; int irq; if (idesc == NULL) return (-1); irq = idesc->intr; - oldspl = splq(1 << irq); + crit_enter(); /* * Find and remove the interrupt descriptor. @@ -919,7 +920,7 @@ inthand_remove(intrec *idesc) hook = &intreclist_head[irq]; while (*hook != idesc) { if (*hook == NULL) { - splx(oldspl); + crit_exit(); return(-1); } hook = &(*hook)->next; @@ -951,7 +952,7 @@ inthand_remove(intrec *idesc) update_intrname(irq, head->name); } update_masks(idesc->maskptr, irq); - splx(oldspl); + crit_exit(); free(idesc, M_DEVBUF); return (0); diff --git a/sys/i386/isa/pmtimer.c b/sys/i386/isa/pmtimer.c index 555de101ea..2b996aa1bd 100644 --- a/sys/i386/isa/pmtimer.c +++ b/sys/i386/isa/pmtimer.c @@ -22,7 +22,7 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * $DragonFly: src/sys/i386/isa/Attic/pmtimer.c,v 1.2 2004/08/02 23:20:30 dillon Exp $ + * $DragonFly: src/sys/i386/isa/Attic/pmtimer.c,v 1.3 2005/06/03 17:14:51 dillon Exp $ */ #include @@ -82,31 +82,28 @@ static struct timeval diff_time; static int pmtimer_suspend(device_t dev) { - int pl; - - pl = splsoftclock(); + crit_enter(); microtime(&diff_time); inittodr(0); microtime(&suspend_time); timevalsub(&diff_time, &suspend_time); - splx(pl); + crit_exit(); return (0); } static int pmtimer_resume(device_t dev) { - int pl; u_int second, minute, hour; struct timeval resume_time; /* modified for adjkerntz */ - pl = splsoftclock(); + crit_enter(); timer_restore(); /* restore the all timers */ inittodr(0); /* adjust time to RTC */ microtime(&resume_time); - splx(pl); + crit_exit(); second = resume_time.tv_sec - suspend_time.tv_sec; hour = second / 3600; second %= 3600; diff --git a/sys/platform/pc32/apm/apm.c b/sys/platform/pc32/apm/apm.c index ae75b61189..0c93972486 100644 --- a/sys/platform/pc32/apm/apm.c +++ b/sys/platform/pc32/apm/apm.c @@ -16,7 +16,7 @@ * Sep, 1994 Implemented on FreeBSD 1.1.5.1R (Toshiba AVS001WD) * * $FreeBSD: src/sys/i386/apm/apm.c,v 1.114.2.5 2002/11/02 04:41:50 iwasaki Exp $ - * $DragonFly: src/sys/platform/pc32/apm/apm.c,v 1.10 2004/09/17 00:21:08 joerg Exp $ + * $DragonFly: src/sys/platform/pc32/apm/apm.c,v 1.11 2005/06/03 17:12:17 dillon Exp $ */ #include @@ -40,6 +40,7 @@ #include #include #include +#include #include #include @@ -322,12 +323,11 @@ apm_battery_low(void) static struct apmhook * apm_add_hook(struct apmhook **list, struct apmhook *ah) { - int s; struct apmhook *p, *prev; APM_DPRINT("Add hook \"%s\"\n", ah->ah_name); - s = splhigh(); + crit_enter(); if (ah == NULL) panic("illegal apm_hook!"); prev = NULL; @@ -342,17 +342,16 @@ apm_add_hook(struct apmhook **list, struct apmhook *ah) ah->ah_next = prev->ah_next; prev->ah_next = ah; } - splx(s); + crit_exit(); return ah; } static void apm_del_hook(struct apmhook **list, struct apmhook *ah) { - int s; struct apmhook *p, *prev; - s = splhigh(); + crit_enter(); prev = NULL; for (p = *list; p != NULL; prev = p, p = p->ah_next) if (p == ah) @@ -365,7 +364,7 @@ deleteit: else *list = p->ah_next; nosuchnode: - splx(s); + crit_exit(); } @@ -410,12 +409,11 @@ static struct timeval diff_time; static int apm_default_resume(void *arg) { - int pl; u_int second, minute, hour; struct timeval resume_time, tmp_time; /* modified for adjkerntz */ - pl = splsoftclock(); + crit_enter(); timer_restore(); /* restore the all timers */ inittodr(0); /* adjust time to RTC */ microtime(&resume_time); @@ -433,7 +431,7 @@ apm_default_resume(void *arg) /* Fixup the calltodo list with the delta time. */ adjust_timeout_calltodo(&resume_time); #endif /* APM_FIXUP_CALLTODOK */ - splx(pl); + crit_exit(); #ifndef APM_FIXUP_CALLTODO second = resume_time.tv_sec - suspend_time.tv_sec; #else /* APM_FIXUP_CALLTODO */ @@ -455,14 +453,12 @@ apm_default_resume(void *arg) static int apm_default_suspend(void *arg) { - int pl; - - pl = splsoftclock(); + crit_enter(); microtime(&diff_time); inittodr(0); microtime(&suspend_time); timevalsub(&diff_time, &suspend_time); - splx(pl); + crit_exit(); return 0; } diff --git a/sys/platform/pc32/gnu/isa/dgb.c b/sys/platform/pc32/gnu/isa/dgb.c index 9af303ddb5..51b7b2354f 100644 --- a/sys/platform/pc32/gnu/isa/dgb.c +++ b/sys/platform/pc32/gnu/isa/dgb.c @@ -1,6 +1,6 @@ /*- * dgb.c $FreeBSD: src/sys/gnu/i386/isa/dgb.c,v 1.56.2.1 2001/02/26 04:23:09 jlemon Exp $ - * dgb.c $DragonFly: src/sys/platform/pc32/gnu/isa/dgb.c,v 1.15 2005/01/31 23:44:35 joerg Exp $ + * dgb.c $DragonFly: src/sys/platform/pc32/gnu/isa/dgb.c,v 1.16 2005/06/03 17:14:47 dillon Exp $ * * Digiboard driver. * @@ -57,6 +57,7 @@ #include #include #include +#include #include @@ -943,7 +944,6 @@ dgbopen(dev_t dev, int flag, int mode, struct thread *td) int mynor; int pnum; struct dgb_p *port; - int s,cs; int error; volatile struct board_chan *bc; @@ -980,7 +980,7 @@ dgbopen(dev_t dev, int flag, int mode, struct thread *td) open_top: - s=spltty(); + crit_enter(); while(port->closing) { error=tsleep(&port->closing, PCATCH, "dgocl", 0); @@ -1016,7 +1016,7 @@ open_top: unit,pnum,error); goto out; } - splx(s); + crit_exit(); goto open_top; } } @@ -1039,7 +1039,7 @@ open_top: port->it_out : port->it_in; - cs=splclock(); + crit_enter(); setwin(sc,0); port->imodem=bc->mstat; bc->rout=bc->rin; /* clear input queue */ @@ -1049,7 +1049,7 @@ open_top: #endif hidewin(sc); - splx(cs); + crit_exit(); port->wopeners++; error=dgbparam(tp, &tp->t_termios); @@ -1080,7 +1080,7 @@ open_top: DPRINT4(DB_OPEN,"dgb%d: port%d: tsleep(dgdcd) error=%d\n",unit,pnum,error); goto out; } - splx(s); + crit_exit(); goto open_top; } error = linesw[tp->t_line].l_open(dev, tp); @@ -1098,7 +1098,7 @@ open_top: out: disc_optim(tp,&tp->t_termios); - splx(s); + crit_exit(); if( !(tp->t_state & TS_ISOPEN) && port->wopeners==0 ) dgbhardclose(port); @@ -1117,7 +1117,6 @@ dgbclose(dev_t dev, int flag, int mode, struct thread *td) struct dgb_softc *sc; struct dgb_p *port; int mynor; - int s; int i; mynor=minor(dev); @@ -1135,7 +1134,7 @@ dgbclose(dev_t dev, int flag, int mode, struct thread *td) DPRINT3(DB_CLOSE,"dgb%d: port%d: draining port\n",unit,pnum); dgb_drain_or_flush(port); - s=spltty(); + crit_enter(); port->closing=1; DPRINT3(DB_CLOSE,"dgb%d: port%d: closing line disc\n",unit,pnum); @@ -1156,7 +1155,7 @@ dgbclose(dev_t dev, int flag, int mode, struct thread *td) if(sc->ports[i].used) break; - splx(s); + crit_exit(); DPRINT3(DB_CLOSE,"dgb%d: port%d: closed\n",unit,pnum); @@ -1175,9 +1174,8 @@ dgbhardclose(port) { struct dgb_softc *sc=&dgb_softc[port->unit]; volatile struct board_chan *bc=port->brdchan; - int cs; - cs=splclock(); + crit_enter(); port->do_timestamp = 0; setwin(sc,0); @@ -1188,7 +1186,7 @@ dgbhardclose(port) } hidewin(sc); - splx(cs); + crit_exit(); callout_reset(&sc->dgb_pause, hz / 2, dgb_pause, &port->brdchan); tsleep(&port->brdchan, PCATCH, "dgclo", 0); @@ -1372,7 +1370,6 @@ dgbpoll(unit_c) int wrapmask=port->txbufsize-1; for(obuf_full=FALSE; tp->t_outq.c_cc!=0 && !obuf_full; ) { - int s; /* add "last-minute" data to write buffer */ if(!(tp->t_state & TS_BUSY)) { hidewin(sc); @@ -1389,7 +1386,7 @@ dgbpoll(unit_c) #endif setwin(sc,0); } - s=spltty(); + crit_enter(); whead=bc->tin & wrapmask; wtail=bc->tout & wrapmask; @@ -1407,7 +1404,7 @@ dgbpoll(unit_c) whead,wtail,size,obuf_full); bc->iempty=1; bc->ilow=1; obuf_full=TRUE; - splx(s); + crit_exit(); break; } @@ -1419,7 +1416,7 @@ dgbpoll(unit_c) setwin(sc,0); bc->tin=whead; bc->tin=whead & wrapmask; - splx(s); + crit_exit(); } if(obuf_full) { @@ -1475,7 +1472,6 @@ dgbioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) struct tty *tp; volatile struct board_chan *bc; int error; - int s,cs; int tiocm_xxx; #if defined(COMPAT_43) || defined(COMPAT_SUNOS) @@ -1566,18 +1562,18 @@ dgbioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) } if(cmd==TIOCSTOP) { - cs=splclock(); + crit_enter(); setwin(sc,0); fepcmd(port, PAUSETX, 0, 0, 0, 0); bmws_set(ws); - splx(cs); + crit_exit(); return 0; } else if(cmd==TIOCSTART) { - cs=splclock(); + crit_enter(); setwin(sc,0); fepcmd(port, RESUMETX, 0, 0, 0, 0); bmws_set(ws); - splx(cs); + crit_exit(); return 0; } @@ -1587,12 +1583,12 @@ dgbioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) error = linesw[tp->t_line].l_ioctl(tp, cmd, data, flag, td); if (error != ENOIOCTL) return error; - s = spltty(); + crit_enter(); error = ttioctl(tp, cmd, data, flag); disc_optim(tp,&tp->t_termios); port->mustdrain=0; if (error != ENOIOCTL) { - splx(s); + crit_exit(); if (cmd == TIOCSETA || cmd == TIOCSETAW || cmd == TIOCSETAF) { DPRINT6(DB_PARAM,"dgb%d: port%d: dgbioctl-RES c=0x%x i=0x%x l=0x%x\n",unit,pnum,tp->t_cflag,tp->t_iflag,tp->t_lflag); } @@ -1605,11 +1601,11 @@ dgbioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) /* error=dgbdrain(port);*/ if(error!=0) { - splx(s); + crit_exit(); return error; } - cs=splclock(); + crit_enter(); setwin(sc,0); /* now it sends 250 millisecond break because I don't know */ @@ -1617,7 +1613,7 @@ dgbioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) fepcmd(port, SENDBREAK, 250, 0, 10, 0); hidewin(sc); - splx(cs); + crit_exit(); break; case TIOCCBRK: /* now it's empty */ @@ -1625,7 +1621,7 @@ dgbioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) case TIOCSDTR: DPRINT3(DB_MODEM,"dgb%d: port%d: set DTR\n",unit,pnum); port->omodem |= DTR; - cs=splclock(); + crit_enter(); setwin(sc,0); fepcmd(port, SETMODEM, port->omodem, RTS, 0, 1); @@ -1634,12 +1630,12 @@ dgbioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) } hidewin(sc); - splx(cs); + crit_exit(); break; case TIOCCDTR: DPRINT3(DB_MODEM,"dgb%d: port%d: reset DTR\n",unit,pnum); port->omodem &= ~DTR; - cs=splclock(); + crit_enter(); setwin(sc,0); fepcmd(port, SETMODEM, port->omodem, RTS|DTR, 0, 1); @@ -1648,7 +1644,7 @@ dgbioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) } hidewin(sc); - splx(cs); + crit_exit(); break; case TIOCMSET: if(*(int *)data & TIOCM_DTR) @@ -1661,11 +1657,11 @@ dgbioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) else port->omodem &=~RTS; - cs=splclock(); + crit_enter(); setwin(sc,0); fepcmd(port, SETMODEM, port->omodem, RTS|DTR, 0, 1); hidewin(sc); - splx(cs); + crit_exit(); break; case TIOCMBIS: if(*(int *)data & TIOCM_DTR) @@ -1674,11 +1670,11 @@ dgbioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) if(*(int *)data & TIOCM_RTS) port->omodem |=RTS; - cs=splclock(); + crit_enter(); setwin(sc,0); fepcmd(port, SETMODEM, port->omodem, RTS|DTR, 0, 1); hidewin(sc); - splx(cs); + crit_exit(); break; case TIOCMBIC: if(*(int *)data & TIOCM_DTR) @@ -1687,11 +1683,11 @@ dgbioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) if(*(int *)data & TIOCM_RTS) port->omodem &=~RTS; - cs=splclock(); + crit_enter(); setwin(sc,0); fepcmd(port, SETMODEM, port->omodem, RTS|DTR, 0, 1); hidewin(sc); - splx(cs); + crit_exit(); break; case TIOCMGET: setwin(sc,0); @@ -1733,7 +1729,7 @@ dgbioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) /* must be root since the wait applies to following logins */ error = suser(td); if (error != 0) { - splx(s); + crit_exit(); return (error); } port->close_delay = *(int *)data * hz / 100; @@ -1751,11 +1747,11 @@ dgbioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) break; default: bmws_set(ws); - splx(s); + crit_exit(); return ENOTTY; } bmws_set(ws); - splx(s); + crit_exit(); return 0; } @@ -1893,7 +1889,6 @@ dgbparam(tp, t) int mval; int iflag; int hflow; - int cs; BoardMemWinState ws=bmws_get(); @@ -1914,7 +1909,7 @@ dgbparam(tp, t) return (EINVAL); } - cs=splclock(); + crit_enter(); setwin(sc,0); if(cflag==0) { /* hangup */ @@ -1967,7 +1962,7 @@ dgbparam(tp, t) } bmws_set(ws); - splx(cs); + crit_exit(); return 0; @@ -1984,7 +1979,6 @@ dgbstart(tp) volatile struct board_chan *bc; int head, tail; int size, ocount; - int s; int wmask; BoardMemWinState ws=bmws_get(); @@ -1997,7 +1991,7 @@ dgbstart(tp) wmask=port->txbufsize-1; - s=spltty(); + crit_enter(); while( tp->t_outq.c_cc!=0 ) { int cs; @@ -2012,7 +2006,7 @@ dgbstart(tp) /*selwakeup(&tp->t_wsel);*/ } #endif - cs=splclock(); + crit_exit(); setwin(sc,0); head=bc->tin & wmask; @@ -2045,10 +2039,10 @@ dgbstart(tp) if(size==0) { bc->iempty=1; bc->ilow=1; - splx(cs); + crit_exit(); bmws_set(ws); tp->t_state|=TS_BUSY; - splx(s); + crit_exit(); return; } @@ -2064,11 +2058,11 @@ dgbstart(tp) DPRINT5(DB_WR,"dgb%d: port%d: tx avail=%d count=%d\n",unit,pnum,size,ocount); hidewin(sc); - splx(cs); + crit_exit(); } bmws_set(ws); - splx(s); + crit_exit(); #ifndef TS_ASLEEP /* post 2.0.5 FreeBSD */ if(tp->t_state & TS_BUSY) { @@ -2095,7 +2089,6 @@ dgbstop(tp, rw) struct dgb_p *port; struct dgb_softc *sc; volatile struct board_chan *bc; - int s; BoardMemWinState ws=bmws_get(); @@ -2108,7 +2101,7 @@ dgbstop(tp, rw) DPRINT3(DB_WR,"dgb%d: port%d: stop\n",port->unit, port->pnum); - s = spltty(); + crit_enter(); setwin(sc,0); if (rw & FWRITE) { @@ -2123,7 +2116,7 @@ dgbstop(tp, rw) } hidewin(sc); bmws_set(ws); - splx(s); + crit_exit(); dgbstart(tp); } diff --git a/sys/platform/pc32/i386/busdma_machdep.c b/sys/platform/pc32/i386/busdma_machdep.c index 7c02788871..93f5c2088b 100644 --- a/sys/platform/pc32/i386/busdma_machdep.c +++ b/sys/platform/pc32/i386/busdma_machdep.c @@ -24,7 +24,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/i386/i386/busdma_machdep.c,v 1.16.2.2 2003/01/23 00:55:27 scottl Exp $ - * $DragonFly: src/sys/platform/pc32/i386/busdma_machdep.c,v 1.12 2005/01/18 14:02:05 joerg Exp $ + * $DragonFly: src/sys/platform/pc32/i386/busdma_machdep.c,v 1.13 2005/06/03 17:14:48 dillon Exp $ */ #include @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -451,9 +452,7 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, /* Reserve Necessary Bounce Pages */ if (map->pagesneeded != 0) { - int s; - - s = splhigh(); + crit_enter(); if (reserve_bounce_pages(dmat, map) != 0) { /* Queue us for resources */ @@ -464,11 +463,11 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, map->callback_arg = callback_arg; STAILQ_INSERT_TAIL(&bounce_map_waitinglist, map, links); - splx(s); + crit_exit(); return (EINPROGRESS); } - splx(s); + crit_exit(); } vaddr = (vm_offset_t)buf; @@ -780,7 +779,6 @@ alloc_bounce_pages(bus_dma_tag_t dmat, u_int numpages) while (numpages > 0) { struct bounce_page *bpage; - int s; bpage = (struct bounce_page *)malloc(sizeof(*bpage), M_DEVBUF, M_INTWAIT); @@ -798,11 +796,11 @@ alloc_bounce_pages(bus_dma_tag_t dmat, u_int numpages) break; } bpage->busaddr = pmap_kextract(bpage->vaddr); - s = splhigh(); + crit_enter(); STAILQ_INSERT_TAIL(&bounce_page_list, bpage, links); total_bpages++; free_bpages++; - splx(s); + crit_exit(); count++; numpages--; } @@ -827,7 +825,6 @@ static bus_addr_t add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr, bus_size_t size) { - int s; struct bounce_page *bpage; if (map->pagesneeded == 0) @@ -838,7 +835,7 @@ add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr, panic("add_bounce_page: map doesn't need any pages"); map->pagesreserved--; - s = splhigh(); + crit_enter(); bpage = STAILQ_FIRST(&bounce_page_list); if (bpage == NULL) panic("add_bounce_page: free page list is empty"); @@ -846,7 +843,7 @@ add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr, STAILQ_REMOVE_HEAD(&bounce_page_list, links); reserved_bpages--; active_bpages++; - splx(s); + crit_exit(); bpage->datavaddr = vaddr; bpage->datacount = size; @@ -857,13 +854,12 @@ add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr, static void free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage) { - int s; struct bus_dmamap *map; bpage->datavaddr = 0; bpage->datacount = 0; - s = splhigh(); + crit_enter(); STAILQ_INSERT_HEAD(&bounce_page_list, bpage, links); free_bpages++; active_bpages--; @@ -876,22 +872,21 @@ free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage) setsoftvm(); } } - splx(s); + crit_exit(); } void busdma_swi() { - int s; struct bus_dmamap *map; - s = splhigh(); + crit_enter(); while ((map = STAILQ_FIRST(&bounce_map_callbacklist)) != NULL) { STAILQ_REMOVE_HEAD(&bounce_map_callbacklist, links); - splx(s); + crit_exit(); bus_dmamap_load(map->dmat, map, map->buf, map->buflen, map->callback, map->callback_arg, /*flags*/0); - s = splhigh(); + crit_enter(); } - splx(s); + crit_exit(); } diff --git a/sys/platform/pc32/i386/pmap.c b/sys/platform/pc32/i386/pmap.c index 45f092b6fe..5a7bc5e7b9 100644 --- a/sys/platform/pc32/i386/pmap.c +++ b/sys/platform/pc32/i386/pmap.c @@ -40,7 +40,7 @@ * * from: @(#)pmap.c 7.7 (Berkeley) 5/12/91 * $FreeBSD: src/sys/i386/i386/pmap.c,v 1.250.2.18 2002/03/06 22:48:53 silby Exp $ - * $DragonFly: src/sys/platform/pc32/i386/pmap.c,v 1.47 2004/10/12 19:29:26 dillon Exp $ + * $DragonFly: src/sys/platform/pc32/i386/pmap.c,v 1.48 2005/06/03 17:14:48 dillon Exp $ */ /* @@ -268,8 +268,7 @@ pmap_pte(pmap_t pmap, vm_offset_t va) * the pv list scans are across different pmaps and it is very wasteful * to do an entire invltlb when checking a single mapping. * - * Should only be called while splvm() is held or from a critical - * section. + * Should only be called while in a critical section. */ static unsigned * pmap_pte_quick(pmap_t pmap, vm_offset_t va) @@ -1341,7 +1340,6 @@ pmap_release(struct pmap *pmap) vm_page_t p,n,ptdpg; vm_object_t object = pmap->pm_pteobj; int curgeneration; - int s; #if defined(DIAGNOSTIC) if (object->ref_count != 1) @@ -1350,7 +1348,7 @@ pmap_release(struct pmap *pmap) ptdpg = NULL; retry: - s = splvm(); + crit_enter(); curgeneration = object->generation; for (p = TAILQ_FIRST(&object->memq); p != NULL; p = n) { n = TAILQ_NEXT(p, listq); @@ -1361,12 +1359,12 @@ retry: while (1) { if (!pmap_release_free_page(pmap, p) && (object->generation != curgeneration)) { - splx(s); + crit_exit(); goto retry; } } } - splx(s); + crit_exit(); if (ptdpg && !pmap_release_free_page(pmap, ptdpg)) goto retry; @@ -1400,12 +1398,11 @@ pmap_growkernel(vm_offset_t addr) { struct proc *p; struct pmap *pmap; - int s; vm_offset_t ptppaddr; vm_page_t nkpg; pd_entry_t newpdir; - s = splhigh(); + crit_enter(); if (kernel_vm_end == 0) { kernel_vm_end = KERNBASE; nkpt = 0; @@ -1446,7 +1443,7 @@ pmap_growkernel(vm_offset_t addr) *pmap_pde(kernel_pmap, kernel_vm_end) = newpdir; kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1); } - splx(s); + crit_exit(); } /* @@ -1554,9 +1551,8 @@ pmap_remove_entry(struct pmap *pmap, vm_page_t m, { pv_entry_t pv; int rtval; - int s; - s = splvm(); + crit_enter(); if (m->md.pv_list_count < pmap->pm_stats.resident_count) { TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) { if (pmap == pv->pv_pmap && va == pv->pv_va) @@ -1579,7 +1575,7 @@ pmap_remove_entry(struct pmap *pmap, vm_page_t m, TAILQ_REMOVE(&pmap->pm_pvlist, pv, pv_plist); free_pv_entry(pv); } - splx(s); + crit_exit(); return rtval; } @@ -1590,10 +1586,9 @@ pmap_remove_entry(struct pmap *pmap, vm_page_t m, static void pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t mpte, vm_page_t m) { - int s; pv_entry_t pv; - s = splvm(); + crit_enter(); pv = get_pv_entry(); pv->pv_va = va; pv->pv_pmap = pmap; @@ -1603,7 +1598,7 @@ pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t mpte, vm_page_t m) TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list); m->md.pv_list_count++; - splx(s); + crit_exit(); } /* @@ -1786,7 +1781,6 @@ pmap_remove_all(vm_page_t m) struct pmap_inval_info info; unsigned *pte, tpte; pv_entry_t pv; - int s; #if defined(PMAP_DIAGNOSTIC) /* @@ -1799,7 +1793,7 @@ pmap_remove_all(vm_page_t m) #endif pmap_inval_init(&info); - s = splvm(); + crit_enter(); while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) { pv->pv_pmap->pm_stats.resident_count--; @@ -1835,7 +1829,7 @@ pmap_remove_all(vm_page_t m) } vm_page_flag_clear(m, PG_MAPPED | PG_WRITEABLE); - splx(s); + crit_exit(); pmap_inval_flush(&info); } @@ -2317,8 +2311,8 @@ retry: * If we are processing a major portion of the object, then scan the * entire thing. * - * We cannot safely scan the object's memq unless we are at splvm(), - * since interrupts can remove pages from objects. + * We cannot safely scan the object's memq unless we are in a + * critical section since interrupts can remove pages from objects. */ crit_enter(); mpte = NULL; @@ -2426,9 +2420,9 @@ pmap_prefault(pmap_t pmap, vm_offset_t addra, vm_map_entry_t entry) starta = 0; /* - * splvm() protection is required to maintain the page/object - * association, interrupts can free pages and remove them from - * their objects. + * critical section protection is required to maintain the + * page/object association, interrupts can free pages and remove + * them from their objects. */ mpte = NULL; crit_enter(); @@ -2828,23 +2822,22 @@ pmap_page_exists_quick(pmap_t pmap, vm_page_t m) { pv_entry_t pv; int loops = 0; - int s; if (!pmap_initialized || (m->flags & PG_FICTITIOUS)) return FALSE; - s = splvm(); + crit_enter(); TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) { if (pv->pv_pmap == pmap) { - splx(s); + crit_exit(); return TRUE; } loops++; if (loops >= 16) break; } - splx(s); + crit_exit(); return (FALSE); } @@ -2862,7 +2855,6 @@ pmap_remove_pages(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) { unsigned *pte, tpte; pv_entry_t pv, npv; - int s; vm_page_t m; pmap_inval_info info; @@ -2874,7 +2866,7 @@ pmap_remove_pages(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) #endif pmap_inval_init(&info); - s = splvm(); + crit_enter(); for(pv = TAILQ_FIRST(&pmap->pm_pvlist); pv; pv = npv) { @@ -2929,7 +2921,7 @@ pmap_remove_pages(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) free_pv_entry(pv); } pmap_inval_flush(&info); - splx(s); + crit_exit(); } /* @@ -2942,7 +2934,6 @@ pmap_testbit(vm_page_t m, int bit) { pv_entry_t pv; unsigned *pte; - int s; if (!pmap_initialized || (m->flags & PG_FICTITIOUS)) return FALSE; @@ -2950,7 +2941,7 @@ pmap_testbit(vm_page_t m, int bit) if (TAILQ_FIRST(&m->md.pv_list) == NULL) return FALSE; - s = splvm(); + crit_enter(); TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) { /* @@ -2971,11 +2962,11 @@ pmap_testbit(vm_page_t m, int bit) #endif pte = pmap_pte_quick(pv->pv_pmap, pv->pv_va); if (*pte & bit) { - splx(s); + crit_exit(); return TRUE; } } - splx(s); + crit_exit(); return (FALSE); } @@ -2988,13 +2979,12 @@ pmap_changebit(vm_page_t m, int bit, boolean_t setem) struct pmap_inval_info info; pv_entry_t pv; unsigned *pte; - int s; if (!pmap_initialized || (m->flags & PG_FICTITIOUS)) return; pmap_inval_init(&info); - s = splvm(); + crit_enter(); /* * Loop over all current mappings setting/clearing as appropos If @@ -3054,7 +3044,7 @@ pmap_changebit(vm_page_t m, int bit, boolean_t setem) } } pmap_inval_flush(&info); - splx(s); + crit_exit(); } /* @@ -3097,13 +3087,12 @@ pmap_ts_referenced(vm_page_t m) { pv_entry_t pv, pvf, pvn; unsigned *pte; - int s; int rtval = 0; if (!pmap_initialized || (m->flags & PG_FICTITIOUS)) return (rtval); - s = splvm(); + crit_enter(); if ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) { @@ -3134,7 +3123,7 @@ pmap_ts_referenced(vm_page_t m) } } while ((pv = pvn) != NULL && pv != pvf); } - splx(s); + crit_exit(); return (rtval); } diff --git a/sys/platform/pc32/i386/sys_machdep.c b/sys/platform/pc32/i386/sys_machdep.c index 53e096e939..c03c0be2cb 100644 --- a/sys/platform/pc32/i386/sys_machdep.c +++ b/sys/platform/pc32/i386/sys_machdep.c @@ -32,7 +32,7 @@ * * from: @(#)sys_machdep.c 5.5 (Berkeley) 1/19/91 * $FreeBSD: src/sys/i386/i386/sys_machdep.c,v 1.47.2.3 2002/10/07 17:20:00 jhb Exp $ - * $DragonFly: src/sys/platform/pc32/i386/sys_machdep.c,v 1.17 2005/05/23 18:23:29 dillon Exp $ + * $DragonFly: src/sys/platform/pc32/i386/sys_machdep.c,v 1.18 2005/06/03 17:14:48 dillon Exp $ * */ @@ -344,7 +344,6 @@ i386_get_ldt(struct proc *p, char *args, int *res) struct pcb_ldt *pcb_ldt = pcb->pcb_ldt; unsigned int nldt, num; union descriptor *lp; - int s; struct i386_ldt_args ua, *uap = &ua; if ((error = copyin(args, uap, sizeof(struct i386_ldt_args))) < 0) @@ -355,7 +354,7 @@ i386_get_ldt(struct proc *p, char *args, int *res) uap->start, uap->num, (void *)uap->descs); #endif - s = splhigh(); + crit_enter(); if (pcb_ldt) { nldt = (unsigned int)pcb_ldt->ldt_len; @@ -372,14 +371,14 @@ i386_get_ldt(struct proc *p, char *args, int *res) * are limited in scope, but uap->start can be anything. */ if (uap->start > nldt || uap->start + num > nldt) { - splx(s); + crit_exit(); return(EINVAL); } error = copyout(lp, uap->descs, num * sizeof(union descriptor)); if (!error) *res = num; - splx(s); + crit_exit(); return(error); } diff --git a/sys/platform/pc32/include/physio_proc.h b/sys/platform/pc32/include/physio_proc.h index 11aeda24b5..8c194bde9b 100644 --- a/sys/platform/pc32/include/physio_proc.h +++ b/sys/platform/pc32/include/physio_proc.h @@ -1,5 +1,5 @@ /* $FreeBSD: src/sys/i386/include/physio_proc.h,v 1.1.2.1 2000/10/29 11:05:48 non Exp $ */ -/* $DragonFly: src/sys/platform/pc32/include/Attic/physio_proc.h,v 1.9 2004/08/10 16:03:12 eirikn Exp $ */ +/* $DragonFly: src/sys/platform/pc32/include/Attic/physio_proc.h,v 1.10 2005/06/03 17:14:50 dillon Exp $ */ /* $NecBSD: physio_proc.h,v 3.4 1999/07/23 20:47:03 honda Exp $ */ /* $NetBSD$ */ @@ -36,6 +36,7 @@ #include #include +#include struct physio_proc; TAILQ_HEAD(physio_proc_head, physio_proc); @@ -54,21 +55,20 @@ physio_proc_enter(bp) struct buf *bp; { struct physio_proc *pp; - int s; if (bp == NULL || (bp->b_flags & B_PHYS) == 0) return NULL; if ((pp = TAILQ_FIRST(&physio_proc_freet)) == NULL) return NULL; - s = splstatclock(); + crit_enter(); TAILQ_REMOVE(&physio_proc_freet, pp, pp_chain); #if !(defined(__DragonFly__) || defined(__FreeBSD__)) || \ (defined(__FreeBSD_version) && __FreeBSD_version < 400001) pp->pp_proc = bp->b_proc; #endif TAILQ_INSERT_TAIL(&physio_proc_busyt, pp, pp_chain); - splx(s); + crit_exit(); return pp; } @@ -76,16 +76,14 @@ static __inline void physio_proc_leave(pp) struct physio_proc *pp; { - int s; - if (pp == NULL) return; - s = splstatclock(); + crit_enter(); TAILQ_REMOVE(&physio_proc_busyt, pp, pp_chain); TAILQ_INSERT_TAIL(&physio_proc_freet, pp, pp_chain); pp->pp_proc = NULL; - splx(s); + crit_exit(); } void physio_proc_init (void); diff --git a/sys/platform/pc32/isa/asc.c b/sys/platform/pc32/isa/asc.c index aa25acb01e..e81a2347ca 100644 --- a/sys/platform/pc32/isa/asc.c +++ b/sys/platform/pc32/isa/asc.c @@ -35,7 +35,7 @@ */ /* * $FreeBSD: src/sys/i386/isa/asc.c,v 1.42.2.2 2001/03/01 03:22:39 jlemon Exp $ - * $DragonFly: src/sys/platform/pc32/isa/asc.c,v 1.8 2004/05/19 22:52:57 dillon Exp $ + * $DragonFly: src/sys/platform/pc32/isa/asc.c,v 1.9 2005/06/03 17:14:51 dillon Exp $ */ #include "use_asc.h" @@ -49,6 +49,7 @@ #include #include #include +#include #include @@ -699,7 +700,7 @@ ascread(dev_t dev, struct uio *uio, int ioflag) int unit = UNIT(minor(dev)); struct asc_unit *scu = unittab + unit; size_t nbytes; - int sps, res; + int res; unsigned char *p; lprintf("asc%d.read: minor %d icnt %ld\n", unit, minor(dev), scu->icnt); @@ -726,7 +727,7 @@ ascread(dev_t dev, struct uio *uio, int ioflag) scu->sbuf.wptr, scu->sbuf.count, scu->bcount,scu->flags, scu->icnt); - sps=spltty(); + crit_enter(); if ( scu->sbuf.count == 0 ) { /* no data avail., must wait */ if (!(scu->flags & DMA_ACTIVE)) dma_restart(scu); scu->flags |= SLEEPING; @@ -734,7 +735,7 @@ ascread(dev_t dev, struct uio *uio, int ioflag) scu->flags &= ~SLEEPING; if ( res == 0 ) res = SUCCESS; } - splx(sps); /* lower priority... */ + crit_exit(); if (scu->flags & FLAG_DEBUG) tsleep((caddr_t)scu, PCATCH, "ascdly",hz); lprintf("asc%d.read(after): " @@ -762,13 +763,13 @@ ascread(dev_t dev, struct uio *uio, int ioflag) return res; } - sps=spltty(); + crit_enter(); scu->sbuf.rptr += nbytes; if (scu->sbuf.rptr >= scu->sbuf.size) scu->sbuf.rptr=0; scu->sbuf.count -= nbytes; /* having moved some data, can read mode */ if (!(scu->flags & DMA_ACTIVE)) dma_restart(scu); - splx(sps); /* lower priority... */ + crit_exit(); if ( scu->flags & PBM_MODE ) scu->bcount -= nbytes; lprintf("asc%d.read: size 0x%x, pointer 0x%x, bcount 0x%x, ok\n", @@ -852,7 +853,6 @@ ascpoll(dev_t dev, int events, struct thread *td) { int unit = UNIT(minor(dev)); struct asc_unit *scu = unittab + unit; - int sps; struct proc *p; struct proc *p1; int revents = 0; @@ -860,7 +860,7 @@ ascpoll(dev_t dev, int events, struct thread *td) p = td->td_proc; KKASSERT(p); - sps=spltty(); + crit_enter(); if (events & (POLLIN | POLLRDNORM)) { if (scu->sbuf.count >0) @@ -876,6 +876,6 @@ ascpoll(dev_t dev, int events, struct thread *td) scu->selp.si_pid = p->p_pid; } } - splx(sps); + crit_exit(); return (revents); } diff --git a/sys/platform/pc32/isa/clock.c b/sys/platform/pc32/isa/clock.c index 7c68d6d6e9..e6341a2a51 100644 --- a/sys/platform/pc32/isa/clock.c +++ b/sys/platform/pc32/isa/clock.c @@ -35,7 +35,7 @@ * * from: @(#)clock.c 7.2 (Berkeley) 5/12/91 * $FreeBSD: src/sys/i386/isa/clock.c,v 1.149.2.6 2002/11/02 04:41:50 iwasaki Exp $ - * $DragonFly: src/sys/platform/pc32/isa/clock.c,v 1.27 2005/06/01 22:55:19 dillon Exp $ + * $DragonFly: src/sys/platform/pc32/isa/clock.c,v 1.28 2005/06/03 17:14:51 dillon Exp $ */ /* @@ -463,30 +463,27 @@ int rtcin(reg) int reg; { - int s; u_char val; - s = splhigh(); + crit_enter(); outb(IO_RTC, reg); inb(0x84); val = inb(IO_RTC + 1); inb(0x84); - splx(s); + crit_exit(); return (val); } static __inline void writertc(u_char reg, u_char val) { - int s; - - s = splhigh(); + crit_enter(); inb(0x84); outb(IO_RTC, reg); inb(0x84); outb(IO_RTC + 1, val); inb(0x84); /* XXX work around wrong order in rtcin() */ - splx(s); + crit_exit(); } static __inline int diff --git a/sys/platform/pc32/isa/intr_machdep.c b/sys/platform/pc32/isa/intr_machdep.c index a395706654..dc1b6312a0 100644 --- a/sys/platform/pc32/isa/intr_machdep.c +++ b/sys/platform/pc32/isa/intr_machdep.c @@ -35,7 +35,7 @@ * * from: @(#)isa.c 7.2 (Berkeley) 5/13/91 * $FreeBSD: src/sys/i386/isa/intr_machdep.c,v 1.29.2.5 2001/10/14 06:54:27 luigi Exp $ - * $DragonFly: src/sys/platform/pc32/isa/intr_machdep.c,v 1.28 2005/05/25 07:58:41 dillon Exp $ + * $DragonFly: src/sys/platform/pc32/isa/intr_machdep.c,v 1.29 2005/06/03 17:14:51 dillon Exp $ */ /* * This file contains an aggregated module marked: @@ -640,20 +640,25 @@ intr_mux(void *arg) { intrec **pp; intrec *p; - intrmask_t oldspl; for (pp = arg; (p = *pp) != NULL; pp = &p->next) { if (p->serializer) { /* - * New handler dispatch method. Note that this + * New handler dispatch method. Only the serializer + * is used to interlock access. Note that this * API includes a handler disablement feature. */ lwkt_serialize_handler_call(p->serializer, p->handler, p->argument); } else { - oldspl = splq(p->mask); + /* + * Old handlers may expect multiple interrupt + * sources to be masked. We must use a critical + * section. + */ + crit_enter(); p->handler(p->argument); - splx(oldspl); + crit_exit(); } } } @@ -840,7 +845,6 @@ inthand_add(const char *name, int irq, inthand2_t handler, void *arg, { intrec *idesc; int errcode = -1; - intrmask_t oldspl; if (ICU_LEN > 8 * sizeof *maskptr) { printf("create_intr: ICU_LEN of %d too high for %d bit intrmask\n", @@ -873,12 +877,10 @@ inthand_add(const char *name, int irq, inthand2_t handler, void *arg, idesc->flags = flags; idesc->serializer = serializer; - /* block this irq */ - oldspl = splq(1 << irq); - /* add irq to class selected by maskptr */ + crit_enter(); errcode = add_intrdesc(idesc); - splx(oldspl); + crit_exit(); if (errcode != 0) { if (bootverbose) @@ -904,14 +906,13 @@ int inthand_remove(intrec *idesc) { intrec **hook, *head; - intrmask_t oldspl; int irq; if (idesc == NULL) return (-1); irq = idesc->intr; - oldspl = splq(1 << irq); + crit_enter(); /* * Find and remove the interrupt descriptor. @@ -919,7 +920,7 @@ inthand_remove(intrec *idesc) hook = &intreclist_head[irq]; while (*hook != idesc) { if (*hook == NULL) { - splx(oldspl); + crit_exit(); return(-1); } hook = &(*hook)->next; @@ -951,7 +952,7 @@ inthand_remove(intrec *idesc) update_intrname(irq, head->name); } update_masks(idesc->maskptr, irq); - splx(oldspl); + crit_exit(); free(idesc, M_DEVBUF); return (0); diff --git a/sys/platform/pc32/isa/pmtimer.c b/sys/platform/pc32/isa/pmtimer.c index b0728e88e5..8bf428871b 100644 --- a/sys/platform/pc32/isa/pmtimer.c +++ b/sys/platform/pc32/isa/pmtimer.c @@ -22,7 +22,7 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * $DragonFly: src/sys/platform/pc32/isa/pmtimer.c,v 1.2 2004/08/02 23:20:30 dillon Exp $ + * $DragonFly: src/sys/platform/pc32/isa/pmtimer.c,v 1.3 2005/06/03 17:14:51 dillon Exp $ */ #include @@ -82,31 +82,28 @@ static struct timeval diff_time; static int pmtimer_suspend(device_t dev) { - int pl; - - pl = splsoftclock(); + crit_enter(); microtime(&diff_time); inittodr(0); microtime(&suspend_time); timevalsub(&diff_time, &suspend_time); - splx(pl); + crit_exit(); return (0); } static int pmtimer_resume(device_t dev) { - int pl; u_int second, minute, hour; struct timeval resume_time; /* modified for adjkerntz */ - pl = splsoftclock(); + crit_enter(); timer_restore(); /* restore the all timers */ inittodr(0); /* adjust time to RTC */ microtime(&resume_time); - splx(pl); + crit_exit(); second = resume_time.tv_sec - suspend_time.tv_sec; hour = second / 3600; second %= 3600; diff --git a/sys/sys/ccbque.h b/sys/sys/ccbque.h index 4eb46c4ede..c1c1c86b51 100644 --- a/sys/sys/ccbque.h +++ b/sys/sys/ccbque.h @@ -28,7 +28,7 @@ * POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/i386/isa/ccbque.h,v 1.3.6.2 2000/10/21 07:44:24 nyan Exp $ - * $DragonFly: src/sys/sys/ccbque.h,v 1.6 2004/10/14 03:05:54 dillon Exp $ + * $DragonFly: src/sys/sys/ccbque.h,v 1.7 2005/06/03 17:14:51 dillon Exp $ */ /* * Common command control queue funcs. @@ -73,8 +73,9 @@ DEV##_init_ccbque(count) \ struct CCBTYPE * \ DEV##_get_ccb() \ { \ - struct CCBTYPE *cb; \ - int s = splcam(); \ + struct CCBTYPE *cb; \ + \ + crit_enter(); \ \ if (CCBTYPE##que.count < CCBTYPE##que.maxccb) \ { \ @@ -100,7 +101,7 @@ DEV##_get_ccb() \ cb = NULL; \ \ out: \ - splx(s); \ + crit_exit(); \ return cb; \ } \ \ @@ -108,7 +109,7 @@ void \ DEV##_free_ccb(cb) \ struct CCBTYPE *cb; \ { \ - int s = splcam(); \ + crit_enter(); \ \ TAILQ_INSERT_TAIL(&CCBTYPE##que.CCBTYPE##tab, cb, CHAIN); \ CCBTYPE##que.count --; \ @@ -118,6 +119,6 @@ DEV##_free_ccb(cb) \ CCBTYPE##que.flags &= ~CCB_MWANTED; \ wakeup ((caddr_t) &CCBTYPE##que.count); \ } \ - splx(s); \ + crit_exit(); \ } #endif /* !_CCBQUE_H_ */ -- 2.41.0