MPSAFE TTY - get rid of tokens in console path
authorAlex Hornung <ahornung@gmail.com>
Sun, 29 Aug 2010 16:17:20 +0000 (17:17 +0100)
committerAlex Hornung <ahornung@gmail.com>
Sun, 29 Aug 2010 16:24:24 +0000 (17:24 +0100)
* The console path (coming through tty_cons.c) can never block, so do
  not try to acquire tokens there.

Reported-by: Jan Lentfer
sys/dev/misc/dcons/dcons_os.c
sys/dev/misc/syscons/scvgarndr.c
sys/dev/misc/syscons/syscons.c
sys/dev/serial/sio/sio.c
sys/platform/vkernel/platform/console.c
sys/platform/vkernel64/platform/console.c

index 08e10b3..55304c9 100644 (file)
@@ -243,7 +243,6 @@ dcons_os_getc(struct dcons_softc *dc)
 static void
 dcons_os_putc(struct dcons_softc *dc, int c)
 {
-       lwkt_gettoken(&tty_token);
        if (dg.dma_tag != NULL)
                bus_dmamap_sync(dg.dma_tag, dg.dma_map, BUS_DMASYNC_POSTWRITE);
 
@@ -251,7 +250,6 @@ dcons_os_putc(struct dcons_softc *dc, int c)
 
        if (dg.dma_tag != NULL)
                bus_dmamap_sync(dg.dma_tag, dg.dma_map, BUS_DMASYNC_PREWRITE);
-       lwkt_reltoken(&tty_token);
 }
 static int
 dcons_open(struct dev_open_args *ap)
@@ -432,7 +430,6 @@ dcons_cnprobe(struct consdev *cp)
 static void
 dcons_cninit(struct consdev *cp)
 {
-       lwkt_gettoken(&tty_token);
        dcons_drv_init(0);
 #if CONS_NODEV
        cp->cn_arg
@@ -440,7 +437,6 @@ dcons_cninit(struct consdev *cp)
        cp->cn_private
 #endif
                = (void *)&sc[DCONS_CON]; /* share port0 with unit0 */
-       lwkt_reltoken(&tty_token);
 }
 
 static void
index 26bf40a..681fff7 100644 (file)
@@ -53,7 +53,7 @@
  * XXX: this still doesn't quite work with tokens (mainly vga_txtcursor*),
  *     so temporarily disable tokens here.
  */
-#if 1
+#if 0
 #define lwkt_gettoken(x)
 #define lwkt_reltoken(x)
 #endif
@@ -177,9 +177,7 @@ vga_nop(scr_stat *scp, ...)
 static void
 vga_txtborder(scr_stat *scp, int color)
 {
-       lwkt_gettoken(&tty_token);
        (*vidsw[scp->sc->adapter]->set_border)(scp->sc->adp, color);
-       lwkt_reltoken(&tty_token);
 }
 
 static void
@@ -210,7 +208,7 @@ vga_txtcursor_shape(scr_stat *scp, int base, int height, int blink)
 {
        if (base < 0 || base >= scp->font_size)
                return;
-       lwkt_gettoken(&tty_token);
+
        /* the caller may set height <= 0 in order to disable the cursor */
 #if 0
        scp->cursor_base = base;
@@ -219,7 +217,7 @@ vga_txtcursor_shape(scr_stat *scp, int base, int height, int blink)
        (*vidsw[scp->sc->adapter]->set_hw_cursor_shape)(scp->sc->adp,
                                                        base, height,
                                                        scp->font_size, blink);
-       lwkt_reltoken(&tty_token);
+
 }
 
 static void
@@ -231,7 +229,6 @@ draw_txtcharcursor(scr_stat *scp, int at, u_short c, u_short a, int flip)
        scp->cursor_saveunder_char = c;
        scp->cursor_saveunder_attr = a;
 
-       //lwkt_gettoken(&tty_token);
 #ifndef SC_NO_FONT_LOADING
        if (sc->flags & SC_CHAR_CURSOR) {
                unsigned char *font;
@@ -284,7 +281,6 @@ draw_txtcharcursor(scr_stat *scp, int at, u_short c, u_short a, int flip)
                                | ((a & 0x7000) >> 4) | ((a & 0x0700) << 4);
                sc_vtb_putc(&scp->scr, at, c, a);
        }
-       //lwkt_reltoken(&tty_token);
 }
 
 static void
@@ -296,7 +292,6 @@ vga_txtcursor(scr_stat *scp, int at, int blink, int on, int flip)
        if (scp->cursor_height <= 0)    /* the text cursor is disabled */
                return;
 
-       //lwkt_gettoken(&tty_token);
        adp = scp->sc->adp;
        if (blink) {
                scp->status |= VR_CURSOR_BLINK;
@@ -332,7 +327,6 @@ vga_txtcursor(scr_stat *scp, int at, int blink, int on, int flip)
                        scp->status &= ~VR_CURSOR_ON;
                }
        }
-       //lwkt_reltoken(&tty_token);
 }
 
 static void
@@ -354,8 +348,6 @@ draw_txtmouse(scr_stat *scp, int x, int y)
        int xoffset, yoffset;
        int i;
 
-       lwkt_gettoken(&tty_token);
-
        /* prepare mousepointer char's bitmaps */
        pos = (y/scp->font_size - scp->yoff)*scp->xsize + x/8 - scp->xoff;
        bcopy(scp->font + sc_vtb_getc(&scp->scr, pos)*scp->font_size,
@@ -427,7 +419,6 @@ draw_txtmouse(scr_stat *scp, int x, int y)
        sc_vtb_putc(&scp->scr, pos, sc_vtb_getc(&scp->scr, pos), color);
     }
 
-    lwkt_reltoken(&tty_token);
 }
 
 static void
index dff5331..72854f0 100644 (file)
@@ -1506,13 +1506,11 @@ scstart(struct tty *tp)
     u_char buf[PCBURST];
     scr_stat *scp = SC_STAT(tp->t_dev);
 
-    lwkt_gettoken(&tty_token);
     syscons_lock();
     if (scp->status & SLKED ||
        (scp == scp->sc->cur_scp && scp->sc->blink_in_progress))
     {
        syscons_unlock();
-       lwkt_reltoken(&tty_token);
        return;
     }
     if (!(tp->t_state & (TS_TIMEOUT | TS_BUSY | TS_TTSTOP))) {
@@ -1526,7 +1524,6 @@ scstart(struct tty *tp)
        ttwwakeup(tp);
     }
     syscons_unlock();
-    lwkt_reltoken(&tty_token);
 }
 
 static void
@@ -1535,7 +1532,6 @@ sccnprobe(struct consdev *cp)
     int unit;
     int flags;
 
-    lwkt_gettoken(&tty_token);
     cp->cn_pri = sc_get_cons_priority(&unit, &flags);
 
     /* a video card is always required */
@@ -1546,7 +1542,6 @@ sccnprobe(struct consdev *cp)
     sckbdprobe(unit, flags, TRUE);
 
     if (cp->cn_pri == CN_DEAD) {
-        lwkt_reltoken(&tty_token);
        return;
     }
 
@@ -1560,12 +1555,10 @@ sccninit(struct consdev *cp)
     int unit;
     int flags;
 
-    lwkt_gettoken(&tty_token);
     sc_get_cons_priority(&unit, &flags);
     scinit(unit, flags | SC_KERNEL_CONSOLE);
     sc_console_unit = unit;
     sc_console = sc_get_softc(unit, SC_KERNEL_CONSOLE)->console_scp;
-    lwkt_reltoken(&tty_token);
 }
 
 static void
@@ -1584,7 +1577,6 @@ sccnterm(struct consdev *cp)
     if (sc_console_unit < 0)
        return;                 /* shouldn't happen */
 
-    lwkt_gettoken(&tty_token);
 #if 0 /* XXX */
     sc_clear_screen(sc_console);
     sccnupdate(sc_console);
@@ -1592,7 +1584,6 @@ sccnterm(struct consdev *cp)
     scterm(sc_console_unit, SC_KERNEL_CONSOLE);
     sc_console_unit = -1;
     sc_console = NULL;
-    lwkt_reltoken(&tty_token);
 }
 
 static void
@@ -1607,7 +1598,6 @@ sccnputc(void *private, int c)
 
     /* assert(sc_console != NULL) */
 
-    lwkt_gettoken(&tty_token);
     syscons_lock();
 #ifndef SC_NO_HISTORY
     if (scp == scp->sc->cur_scp && scp->status & SLKED) {
@@ -1638,7 +1628,6 @@ sccnputc(void *private, int c)
 
     sccnupdate(scp);
     syscons_unlock();
-    lwkt_reltoken(&tty_token);
 }
 
 static int
@@ -1664,7 +1653,6 @@ sccndbctl(void *private, int on)
         * and the screen is updated before switching to 
         * the vty0.
         */
-        lwkt_gettoken(&tty_token);
        scrn_timer(NULL);
        if (!cold
            && sc_console->sc->cur_scp->smode.mode == VT_AUTO
@@ -1672,7 +1660,6 @@ sccndbctl(void *private, int on)
            sc_console->sc->cur_scp->status |= MOUSE_HIDDEN;
            sc_switch_scr(sc_console->sc, sc_console->index);
        }
-       lwkt_reltoken(&tty_token);
     }
     if (on)
        ++debugger;
@@ -1690,7 +1677,6 @@ sccngetch(int flags)
     int cur_mode;
     int c;
 
-    lwkt_gettoken(&tty_token);
     syscons_lock();
     /* assert(sc_console != NULL) */
 
@@ -1704,12 +1690,10 @@ sccngetch(int flags)
     syscons_unlock();
 
     if (fkeycp < fkey.len) {
-        lwkt_reltoken(&tty_token);
        return fkey.str[fkeycp++];
     }
 
     if (scp->sc->kbd == NULL) {
-        lwkt_reltoken(&tty_token);
        return -1;
     }
 
@@ -1736,7 +1720,6 @@ sccngetch(int flags)
 
     switch (KEYFLAGS(c)) {
     case 0:    /* normal char */
-        lwkt_reltoken(&tty_token);
        return KEYCHAR(c);
     case FKEY: /* function key */
        p = kbd_get_fkeystr(scp->sc->kbd, KEYCHAR(c), (size_t *)&fkeycp);
@@ -1747,12 +1730,10 @@ sccngetch(int flags)
            lwkt_reltoken(&tty_token);
            return fkey.str[0];
        }
-       lwkt_reltoken(&tty_token);
        return c;       /* XXX */
     case NOKEY:
     case ERRKEY:
     default:
-        lwkt_reltoken(&tty_token);
        return -1;
     }
     /* NOT REACHED */
@@ -1765,14 +1746,12 @@ sccnupdate(scr_stat *scp)
 
     lwkt_gettoken(&tty_token);
     if (scp->sc->font_loading_in_progress || scp->sc->videoio_in_progress) {
-        lwkt_reltoken(&tty_token);
        return;
     }
 
     if (debugger > 0 || panicstr || shutdown_in_progress) {
        sc_touch_scrn_saver();
     } else if (scp != scp->sc->cur_scp) {
-        lwkt_reltoken(&tty_token);
        return;
     }
 
@@ -1786,7 +1765,6 @@ sccnupdate(scr_stat *scp)
 
     if (scp != scp->sc->cur_scp || scp->sc->blink_in_progress
        || scp->sc->switch_in_progress) {
-       lwkt_reltoken(&tty_token);
        return;
     }
     /*
@@ -1796,7 +1774,6 @@ sccnupdate(scr_stat *scp)
 
     if (!ISGRAPHSC(scp) && !(scp->sc->flags & SC_SCRN_BLANKED))
        scrn_update(scp, TRUE);
-    lwkt_reltoken(&tty_token);
 }
 
 static void
@@ -1920,7 +1897,6 @@ scrn_update(scr_stat *scp, int show_cursor)
 
     /* assert(scp == scp->sc->cur_scp) */
 
-    lwkt_gettoken(&tty_token);
     ++scp->sc->videoio_in_progress;
 
 #ifndef SC_NO_CUTPASTE
@@ -1992,7 +1968,6 @@ scrn_update(scr_stat *scp, int show_cursor)
         scp->end = 0;
         scp->start = scp->xsize*scp->ysize - 1;
        --scp->sc->videoio_in_progress;
-       lwkt_reltoken(&tty_token);
        return;
     }
 
@@ -2032,7 +2007,6 @@ scrn_update(scr_stat *scp, int show_cursor)
     scp->start = scp->xsize*scp->ysize - 1;
 
     --scp->sc->videoio_in_progress;
-    lwkt_reltoken(&tty_token);
 }
 
 #if NSPLASH > 0
@@ -2042,7 +2016,6 @@ scsplash_callback(int event, void *arg)
     sc_softc_t *sc;
     int error;
 
-    lwkt_gettoken(&tty_token);
     sc = (sc_softc_t *)arg;
 
     switch (event) {
@@ -2055,7 +2028,6 @@ scsplash_callback(int event, void *arg)
                (*current_saver)(sc, TRUE);
            }
        }
-       lwkt_reltoken(&tty_token);
        return 0;
 
     case SPLASH_TERM:
@@ -2063,15 +2035,12 @@ scsplash_callback(int event, void *arg)
            scsplash_stick(FALSE);
            error = remove_scrn_saver(scsplash_saver);
            if (error) {
-               lwkt_reltoken(&tty_token);
                return error;
             }
        }
-       lwkt_reltoken(&tty_token);
        return 0;
 
     default:
-        lwkt_reltoken(&tty_token);
        return EINVAL;
     }
 }
@@ -2085,7 +2054,6 @@ scsplash_saver(sc_softc_t *sc, int show)
     if (busy)
        return;
     busy = TRUE;
-    lwkt_gettoken(&tty_token);
 
     scp = sc->cur_scp;
     if (show) {
@@ -2112,7 +2080,6 @@ scsplash_saver(sc_softc_t *sc, int show)
            restore_scrn_saver_mode(scp, TRUE);
     }
     busy = FALSE;
-    lwkt_reltoken(&tty_token);
 }
 
 static int
@@ -2157,16 +2124,13 @@ remove_scrn_saver(void (*this_saver)(sc_softc_t *, int))
     if (scrn_blanked)
         stop_scrn_saver(this_saver);
 #endif
-    lwkt_gettoken(&tty_token);
     /* unblank all blanked screens */
     wait_scrn_saver_stop(NULL);
     if (scrn_blanked) {
-        lwkt_reltoken(&tty_token);
        return EBUSY;
     }
 
     current_saver = none_saver;
-    lwkt_reltoken(&tty_token);
     return 0;
 }
 
@@ -2175,7 +2139,6 @@ set_scrn_saver_mode(scr_stat *scp, int mode, u_char *pal, int border)
 {
 
     /* assert(scp == scp->sc->cur_scp) */
-    lwkt_gettoken(&tty_token);
     crit_enter();
     if (!ISGRAPHSC(scp))
        sc_remove_cursor_image(scp);
@@ -2199,7 +2162,6 @@ set_scrn_saver_mode(scr_stat *scp, int mode, u_char *pal, int border)
            load_palette(scp->sc->adp, pal);
 #endif
        sc_set_border(scp, border);
-       lwkt_reltoken(&tty_token);
        return 0;
     } else {
        crit_enter();
@@ -2207,7 +2169,6 @@ set_scrn_saver_mode(scr_stat *scp, int mode, u_char *pal, int border)
        scp->status &= ~(UNKNOWN_MODE | SAVER_RUNNING);
        scp->status |= scp->splash_save_status;
        crit_exit();
-       lwkt_reltoken(&tty_token);
        return 1;
     }
     /* NOTREACHED */
@@ -2220,7 +2181,6 @@ restore_scrn_saver_mode(scr_stat *scp, int changemode)
     int status;
 
     /* assert(scp == scp->sc->cur_scp) */
-    lwkt_gettoken(&tty_token);
     crit_enter();
     mode = scp->mode;
     status = scp->status;
@@ -2233,7 +2193,6 @@ restore_scrn_saver_mode(scr_stat *scp, int changemode)
            sc_draw_cursor_image(scp);
        --scrn_blanked;
        crit_exit();
-       lwkt_reltoken(&tty_token);
        return 0;
     }
     if (set_mode(scp) == 0) {
@@ -2242,13 +2201,11 @@ restore_scrn_saver_mode(scr_stat *scp, int changemode)
 #endif
        --scrn_blanked;
        crit_exit();
-       lwkt_reltoken(&tty_token);
        return 0;
     } else {
        scp->mode = mode;
        scp->status = status;
        crit_exit();
-       lwkt_reltoken(&tty_token);
        return 1;
     }
     /* NOTREACHED */
@@ -2257,7 +2214,6 @@ restore_scrn_saver_mode(scr_stat *scp, int changemode)
 static void
 stop_scrn_saver(sc_softc_t *sc, void (*saver)(sc_softc_t *, int))
 {
-    lwkt_gettoken(&tty_token);
     (*saver)(sc, FALSE);
     run_scrn_saver = FALSE;
     /* the screen saver may have chosen not to stop after all... */
@@ -2270,7 +2226,6 @@ stop_scrn_saver(sc_softc_t *sc, void (*saver)(sc_softc_t *, int))
     if (sc->delayed_next_scr)
        sc_switch_scr(sc, sc->delayed_next_scr - 1);
     wakeup((caddr_t)&scrn_blanked);
-    lwkt_reltoken(&tty_token);
 }
 
 static int
@@ -2692,7 +2647,6 @@ exchange_scr(sc_softc_t *sc)
 static void
 sc_puts(scr_stat *scp, u_char *buf, int len)
 {
-    lwkt_gettoken(&tty_token);
 #if NSPLASH > 0
     /* make screensaver happy */
     if (!sticky_splash && scp == scp->sc->cur_scp)
@@ -2705,13 +2659,11 @@ sc_puts(scr_stat *scp, u_char *buf, int len)
     if (scp->sc->delayed_next_scr)
        sc_switch_scr(scp->sc, scp->sc->delayed_next_scr - 1);
 
-    lwkt_reltoken(&tty_token);
 }
 
 void
 sc_draw_cursor_image(scr_stat *scp)
 {
-    lwkt_gettoken(&tty_token);
     /* assert(scp == scp->sc->cur_scp); */
     ++scp->sc->videoio_in_progress;
     (*scp->rndr->draw_cursor)(scp, scp->cursor_pos,
@@ -2719,20 +2671,17 @@ sc_draw_cursor_image(scr_stat *scp)
                              sc_inside_cutmark(scp, scp->cursor_pos));
     scp->cursor_oldpos = scp->cursor_pos;
     --scp->sc->videoio_in_progress;
-    lwkt_reltoken(&tty_token);
 }
 
 void
 sc_remove_cursor_image(scr_stat *scp)
 {
-    lwkt_gettoken(&tty_token);
     /* assert(scp == scp->sc->cur_scp); */
     ++scp->sc->videoio_in_progress;
     (*scp->rndr->draw_cursor)(scp, scp->cursor_oldpos,
                              scp->sc->flags & SC_BLINK_CURSOR, FALSE,
                              sc_inside_cutmark(scp, scp->cursor_oldpos));
     --scp->sc->videoio_in_progress;
-    lwkt_reltoken(&tty_token);
 }
 
 static void
@@ -2740,7 +2689,6 @@ update_cursor_image(scr_stat *scp)
 {
     int blink;
 
-    lwkt_gettoken(&tty_token);
     if (scp->sc->flags & SC_CHAR_CURSOR) {
        scp->cursor_base = imax(0, scp->sc->cursor_base);
        scp->cursor_height = imin(scp->sc->cursor_height, scp->font_size);
@@ -2758,13 +2706,11 @@ update_cursor_image(scr_stat *scp)
     (*scp->rndr->draw_cursor)(scp, scp->cursor_pos, blink, TRUE, 
                              sc_inside_cutmark(scp, scp->cursor_pos));
     --scp->sc->videoio_in_progress;
-    lwkt_reltoken(&tty_token);
 }
 
 void
 sc_set_cursor_image(scr_stat *scp)
 {
-    lwkt_gettoken(&tty_token);
     if (scp->sc->flags & SC_CHAR_CURSOR) {
        scp->cursor_base = imax(0, scp->sc->cursor_base);
        scp->cursor_height = imin(scp->sc->cursor_height, scp->font_size);
@@ -2778,7 +2724,6 @@ sc_set_cursor_image(scr_stat *scp)
     (*scp->rndr->set_cursor)(scp, scp->cursor_base, scp->cursor_height,
                             scp->sc->flags & SC_BLINK_CURSOR);
     --scp->sc->videoio_in_progress;
-    lwkt_reltoken(&tty_token);
 }
 
 static void
index 6c24c53..75dc249 100644 (file)
@@ -734,6 +734,7 @@ sioprobe(device_t dev, int xrid, u_long rclk)
                kprintf("sio%d: can't drain, serial port might "
                        "not exist, disabling\n", device_get_unit(dev));
                com_unlock();
+               lwkt_reltoken(&tty_token);
                return (ENXIO);
        }
 
@@ -2867,15 +2868,11 @@ CONS_DRIVER(sio, siocnprobe, siocninit, siocninit_fini,
 #include <ddb/ddb.h>
 #endif
 
-/*
- * NOTE: Must be called with tty_token held
- */
 static void
 siocntxwait(Port_t iobase)
 {
        int     timo;
 
-       ASSERT_LWKT_TOKEN_HELD(&tty_token);
        /*
         * Wait for any pending transmission to finish.  Required to avoid
         * the UART lockup bug when the speed is changed, and for normal
@@ -2906,7 +2903,6 @@ siocngetspeed(Port_t iobase, u_long rclk)
        u_char  dlbl;
        u_char  cfcr;
 
-       ASSERT_LWKT_TOKEN_HELD(&tty_token);
        cfcr = inb(iobase + com_cfcr);
        outb(iobase + com_cfcr, CFCR_DLAB | cfcr);
 
@@ -2930,7 +2926,6 @@ siocnopen(struct siocnstate *sp, Port_t iobase, int speed)
        u_char  dlbh;
        u_char  dlbl;
 
-       lwkt_gettoken(&tty_token);
        /*
         * Save all the device control registers except the fifo register
         * and set our default ones (cs8 -parenb speed=comdefaultrate).
@@ -2964,13 +2959,11 @@ siocnopen(struct siocnstate *sp, Port_t iobase, int speed)
         * an interrupt by floating the IRQ line.
         */
        outb(iobase + com_mcr, (sp->mcr & MCR_IENABLE) | MCR_DTR | MCR_RTS);
-       lwkt_reltoken(&tty_token);
 }
 
 static void
 siocnclose(struct siocnstate *sp, Port_t iobase)
 {
-       lwkt_gettoken(&tty_token);
        /*
         * Restore the device control registers.
         */
@@ -2986,7 +2979,6 @@ siocnclose(struct siocnstate *sp, Port_t iobase)
         */
        outb(iobase + com_mcr, sp->mcr | MCR_DTR | MCR_RTS);
        outb(iobase + com_ier, sp->ier);
-       lwkt_reltoken(&tty_token);
 }
 
 static void
@@ -3014,7 +3006,6 @@ siocnprobe(struct consdev *cp)
         */
        cp->cn_pri = CN_DEAD;
 
-       lwkt_gettoken(&tty_token);
        for (unit = 0; unit < 16; unit++) { /* XXX need to know how many */
                int flags;
                int disabled;
@@ -3048,6 +3039,7 @@ siocnprobe(struct consdev *cp)
                         * need to set the speed in hardware so that
                         * switching it later is null.
                         */
+                       com_lock();
                        cfcr = inb(iobase + com_cfcr);
                        outb(iobase + com_cfcr, CFCR_DLAB | cfcr);
                        divisor = siodivisor(comdefaultrclk, comdefaultrate);
@@ -3056,6 +3048,7 @@ siocnprobe(struct consdev *cp)
                        outb(iobase + com_cfcr, cfcr);
 
                        siocnopen(&sp, iobase, comdefaultrate);
+                       com_unlock();
 
                        crit_exit();
                        if (COM_CONSOLE(flags) && !COM_LLCONSOLE(flags)) {
@@ -3097,7 +3090,6 @@ siocnprobe(struct consdev *cp)
        }
 #endif
 #endif
-       lwkt_reltoken(&tty_token);
 }
 
 static void
@@ -3136,11 +3128,11 @@ siocncheckc(void *private)
        Port_t  iobase;
        struct siocnstate       sp;
 
-       lwkt_gettoken(&tty_token);
        if (unit == siogdbunit)
                iobase = siogdbiobase;
        else
                iobase = siocniobase;
+       com_lock();
        crit_enter();
        siocnopen(&sp, iobase, comdefaultrate);
        if (inb(iobase + com_lsr) & LSR_RXRDY)
@@ -3149,7 +3141,7 @@ siocncheckc(void *private)
                c = -1;
        siocnclose(&sp, iobase);
        crit_exit();
-       lwkt_reltoken(&tty_token);
+       com_unlock();
        return (c);
 }
 
@@ -3162,11 +3154,11 @@ siocngetc(void *private)
        Port_t  iobase;
        struct siocnstate       sp;
 
-       lwkt_gettoken(&tty_token);
        if (unit == siogdbunit)
                iobase = siogdbiobase;
        else
                iobase = siocniobase;
+       com_lock();
        crit_enter();
        siocnopen(&sp, iobase, comdefaultrate);
        while (!(inb(iobase + com_lsr) & LSR_RXRDY))
@@ -3174,7 +3166,7 @@ siocngetc(void *private)
        c = inb(iobase + com_data);
        siocnclose(&sp, iobase);
        crit_exit();
-       lwkt_reltoken(&tty_token);
+       com_unlock();
        return (c);
 }
 
@@ -3185,18 +3177,18 @@ siocnputc(void *private, int c)
        struct siocnstate       sp;
        Port_t  iobase;
 
-       lwkt_gettoken(&tty_token);
        if (unit == siogdbunit)
                iobase = siogdbiobase;
        else
                iobase = siocniobase;
+       com_lock();
        crit_enter();
        siocnopen(&sp, iobase, comdefaultrate);
        siocntxwait(iobase);
        outb(iobase + com_data, c);
        siocnclose(&sp, iobase);
        crit_exit();
-       lwkt_reltoken(&tty_token);
+       com_unlock();
 }
 
 DRIVER_MODULE(sio, isa, sio_isa_driver, sio_devclass, 0, 0);
index 70e1133..167a16f 100644 (file)
@@ -265,10 +265,8 @@ static struct consdev *vconsole;
 static void
 vconsprobe(struct consdev *cp)
 {
-       lwkt_gettoken(&tty_token);
        cp->cn_pri = CN_NORMAL;
        cp->cn_probegood = 1;
-       lwkt_reltoken(&tty_token);
 }
 
 /*
@@ -283,7 +281,6 @@ vconssignal(int sig)
        struct sigaction sa, osa;
        sigset_t ss, oss;
 
-       lwkt_gettoken(&tty_token);
        tcgetattr(0, &curtio);
        tcsetattr(0, TCSAFLUSH, &init_tio);
        bzero(&sa, sizeof(sa));
@@ -297,7 +294,6 @@ vconssignal(int sig)
        sigprocmask(SIG_SETMASK, &oss, NULL);
        sigaction(sig, &osa, NULL);
        tcsetattr(0, TCSAFLUSH, &curtio);
-       lwkt_reltoken(&tty_token);
 }
 
 static void
@@ -311,7 +307,6 @@ vconswinch_intr(void *arg __unused, void *frame __unused)
 {
        struct winsize newsize;
 
-       lwkt_gettoken(&tty_token);
        if (vconsole != NULL && vconsole->cn_dev->si_tty != NULL) {
                ioctl(0, TIOCGWINSZ, &newsize);
                /*
@@ -325,7 +320,6 @@ vconswinch_intr(void *arg __unused, void *frame __unused)
                        pgsignal(vconsole->cn_dev->si_tty->t_pgrp, SIGWINCH, 1);
                }
        }
-       lwkt_reltoken(&tty_token);
 }
 
 static void
@@ -334,10 +328,8 @@ vconscleanup(void)
        /*
         * We might catch stray SIGIOs, so try hard.
         */
-       lwkt_gettoken(&tty_token);
        while (tcsetattr(0, TCSAFLUSH, &init_tio) != 0 && errno == EINTR)
                /* NOTHING */;
-       lwkt_reltoken(&tty_token);
 }
 
 static void
@@ -347,7 +339,6 @@ vconsinit(struct consdev *cp)
 
        vconsole = cp;
 
-       lwkt_gettoken(&tty_token);
        tcgetattr(0, &init_tio);
        bzero(&sa, sizeof(sa));
        sigemptyset(&sa.sa_mask);
@@ -357,7 +348,6 @@ vconsinit(struct consdev *cp)
        sigaction(SIGTERM, &sa, NULL);
        atexit(vconscleanup);
        vcons_set_mode(0);
-       lwkt_reltoken(&tty_token);
 }
 
 static void
@@ -403,7 +393,6 @@ vconsgetc(void *private)
        unsigned char c;
        ssize_t n;
 
-       lwkt_gettoken(&tty_token);
        console_stolen_by_kernel = 1;
        for (;;) {
                n = pread(0, &c, 1, -1);
@@ -414,7 +403,6 @@ vconsgetc(void *private)
                panic("vconsgetc: EOF on console %d %d", n ,errno);
        }
        console_stolen_by_kernel = 0;
-       lwkt_reltoken(&tty_token);
        return((int)c);
 }
 
@@ -441,9 +429,7 @@ vcons_set_mode(int in_debugger)
 {
        struct termios tio;
 
-       lwkt_gettoken(&tty_token);
        if (tcgetattr(0, &tio) < 0) {
-               lwkt_reltoken(&tty_token);
                return;
        }
        cfmakeraw(&tio);
@@ -459,5 +445,4 @@ vcons_set_mode(int in_debugger)
                tio.c_cc[VSTATUS] = _POSIX_VDISABLE;
        }
        tcsetattr(0, TCSAFLUSH, &tio);
-       lwkt_reltoken(&tty_token);
 }
index 76065d7..7e82738 100644 (file)
@@ -281,7 +281,6 @@ vconssignal(int sig)
        struct sigaction sa, osa;
        sigset_t ss, oss;
 
-       lwkt_gettoken(&tty_token);
        tcgetattr(0, &curtio);
        tcsetattr(0, TCSAFLUSH, &init_tio);
        bzero(&sa, sizeof(sa));
@@ -295,7 +294,6 @@ vconssignal(int sig)
        sigprocmask(SIG_SETMASK, &oss, NULL);
        sigaction(sig, &osa, NULL);
        tcsetattr(0, TCSAFLUSH, &curtio);
-       lwkt_reltoken(&tty_token);
 }
 
 static void
@@ -309,7 +307,6 @@ vconswinch_intr(void *arg __unused, void *frame __unused)
 {
        struct winsize newsize;
 
-       lwkt_gettoken(&tty_token);
        if (vconsole != NULL && vconsole->cn_dev->si_tty != NULL) {
                ioctl(0, TIOCGWINSZ, &newsize);
                /*
@@ -323,7 +320,6 @@ vconswinch_intr(void *arg __unused, void *frame __unused)
                        pgsignal(vconsole->cn_dev->si_tty->t_pgrp, SIGWINCH, 1);
                }
        }
-       lwkt_reltoken(&tty_token);
 }
 
 static void
@@ -332,10 +328,8 @@ vconscleanup(void)
        /*
         * We might catch stray SIGIOs, so try hard.
         */
-       lwkt_gettoken(&tty_token);
        while (tcsetattr(0, TCSAFLUSH, &init_tio) != 0 && errno == EINTR)
                /* NOTHING */;
-       lwkt_reltoken(&tty_token);
 }
 
 static void
@@ -345,7 +339,6 @@ vconsinit(struct consdev *cp)
 
        vconsole = cp;
 
-       lwkt_gettoken(&tty_token);
        tcgetattr(0, &init_tio);
        bzero(&sa, sizeof(sa));
        sigemptyset(&sa.sa_mask);
@@ -355,7 +348,6 @@ vconsinit(struct consdev *cp)
        sigaction(SIGTERM, &sa, NULL);
        atexit(vconscleanup);
        vcons_set_mode(0);
-       lwkt_reltoken(&tty_token);
 }
 
 static void
@@ -437,9 +429,7 @@ vcons_set_mode(int in_debugger)
 {
        struct termios tio;
 
-       lwkt_gettoken(&tty_token);
        if (tcgetattr(0, &tio) < 0) {
-               lwkt_reltoken(&tty_token);
                return;
        }
        cfmakeraw(&tio);
@@ -455,5 +445,4 @@ vcons_set_mode(int in_debugger)
                tio.c_cc[VSTATUS] = _POSIX_VDISABLE;
        }
        tcsetattr(0, TCSAFLUSH, &tio);
-       lwkt_reltoken(&tty_token);
 }