Changes to consdev - low level kernel console initialization.
authorMatthew Dillon <dillon@dragonflybsd.org>
Mon, 7 May 2007 05:21:42 +0000 (05:21 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Mon, 7 May 2007 05:21:42 +0000 (05:21 +0000)
The consdev API was calling make_dev() extremely early in the boot sequence,
but except for a little code in syscons didn't really need the abstraction
to operate the kernel console during boot.

Change the consdev API to no longer require the use the device abstraction
to operate.  This will allow the device ABI (cdev_t) to be converted to
use SYSREF.

sys/cpu/i386/misc/i386-gdbstub.c
sys/ddb/db_command.c
sys/ddb/ddb.h
sys/dev/misc/dcons/dcons_os.c
sys/dev/misc/syscons/syscons.c
sys/dev/misc/syscons/syscons.h
sys/dev/serial/sio/sio.c
sys/kern/tty_cons.c
sys/platform/vkernel/platform/console.c
sys/sys/conf.h
sys/sys/cons.h

index 16ed757..0be084e 100644 (file)
@@ -92,7 +92,7 @@
  *
  ****************************************************************************/
 /* $FreeBSD: src/sys/i386/i386/i386-gdbstub.c,v 1.13.2.1 2000/08/03 00:54:41 peter Exp $ */
-/* $DragonFly: src/sys/cpu/i386/misc/i386-gdbstub.c,v 1.6 2007/01/06 03:34:39 dillon Exp $ */
+/* $DragonFly: src/sys/cpu/i386/misc/i386-gdbstub.c,v 1.7 2007/05/07 05:21:37 dillon Exp $ */
 
 #include "opt_ddb.h"
 
@@ -146,18 +146,18 @@ strcpy (char *dst, const char *src)
 static int
 putDebugChar (int c)           /* write a single character      */
 {
-  if (gdbdev == NOCDEV)
+  if (gdb_tab == NULL)
        return 0;
-  (*gdb_putc)(gdbdev, c);
+  gdb_tab->cn_putc(gdb_tab->cn_gdbprivate, c);
   return 1;
 }
 
 static int
 getDebugChar (void)            /* read and return a single char */
 {
-  if (gdbdev == NOCDEV)
+  if (gdb_tab == NULL)
        return -1;
-  return (*gdb_getc)(gdbdev);
+  return gdb_tab->cn_getc(gdb_tab->cn_gdbprivate);
 }
 
 static const char hexchars[]="0123456789abcdef";
index eca1b96..8425c91 100644 (file)
@@ -24,7 +24,7 @@
  * rights to redistribute these changes.
  *
  * $FreeBSD: src/sys/ddb/db_command.c,v 1.34.2.2 2001/07/29 22:48:36 kris Exp $
- * $DragonFly: src/sys/ddb/db_command.c,v 1.11 2006/09/10 01:26:33 dillon Exp $
+ * $DragonFly: src/sys/ddb/db_command.c,v 1.12 2007/05/07 05:21:38 dillon Exp $
  */
 
 /*
@@ -545,15 +545,10 @@ db_fncall(db_expr_t dummy1, boolean_t dummy2, db_expr_t dummy3, char *dummy4)
 
 /* Enter GDB remote protocol debugger on the next trap. */
 
-cdev_t    gdbdev = NOCDEV;
-cn_getc_t *gdb_getc;
-cn_putc_t *gdb_putc;
-
 static void
 db_gdb(db_expr_t dummy1, boolean_t dummy2, db_expr_t dummy3, char *dummy4)
 {
-
-       if (gdbdev == NOCDEV) {
+       if (gdb_tab == NULL) {
                db_printf("No gdb port enabled. Set flag 0x80 on desired port\n");
                db_printf("in your configuration file (currently sio only).\n");
                return;
index ddd8561..c76ea8a 100644 (file)
@@ -28,7 +28,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/ddb/ddb.h,v 1.24.2.2 2002/08/30 22:27:49 gibbs Exp $
- * $DragonFly: src/sys/ddb/ddb.h,v 1.11 2006/11/07 06:43:23 dillon Exp $
+ * $DragonFly: src/sys/ddb/ddb.h,v 1.12 2007/05/07 05:21:38 dillon Exp $
  */
 
 /*
@@ -162,14 +162,4 @@ struct command {
        struct command *more;   /* another level of command */
 };
 
-/* XXX: UGLY hack */
-#ifdef CN_DEAD
-/*
- * Routines to support GDB on an sio port.
- */
-extern cdev_t     gdbdev;
-extern cn_getc_t *gdb_getc;
-extern cn_putc_t *gdb_putc;
-#endif
-
 #endif /* !_DDB_DDB_H_ */
index 9d5f72a..9ebba48 100644 (file)
@@ -32,7 +32,7 @@
  * SUCH DAMAGE.
  * 
  * $FreeBSD: src/sys/dev/dcons/dcons_os.c,v 1.4 2004/10/24 12:41:04 simokawa Exp $
- * $DragonFly: src/sys/dev/misc/dcons/dcons_os.c,v 1.10 2007/01/06 08:34:51 dillon Exp $
+ * $DragonFly: src/sys/dev/misc/dcons/dcons_os.c,v 1.11 2007/05/07 05:21:40 dillon Exp $
  */
 
 #include <sys/param.h>
 #define DCONS_FORCE_GDB        1
 #endif
 
-#if __FreeBSD_version >= 500101
-#define CONS_NODEV     1
-#if __FreeBSD_version < 502122
-static struct consdev gdbconsdev;
-#endif
-#endif
-
 #define CDEV_MAJOR      184
 
 static d_open_t                dcons_open;
@@ -147,12 +140,13 @@ static int        dcons_drv_init(int);
 
 static cn_probe_t      dcons_cnprobe;
 static cn_init_t       dcons_cninit;
+static cn_init_fini_t  dcons_cninit_fini;
 static cn_getc_t       dcons_cngetc;
 static cn_checkc_t     dcons_cncheckc;
 static cn_putc_t       dcons_cnputc;
 
-CONS_DRIVER(dcons, dcons_cnprobe, dcons_cninit, NULL, dcons_cngetc,
-    dcons_cncheckc, dcons_cnputc, NULL);
+CONS_DRIVER(dcons, dcons_cnprobe, dcons_cninit, dcons_cninit_fini,
+           NULL, dcons_cngetc, dcons_cncheckc, dcons_cnputc, NULL);
 
 #if __FreeBSD_version >= 502122
 static gdb_probe_f dcons_dbg_probe;
@@ -395,8 +389,7 @@ static void
 dcons_cnprobe(struct consdev *cp)
 {
 #ifdef __DragonFly__
-       cp->cn_dev = make_dev(&dcons_ops, DCONS_CON,
-           UID_ROOT, GID_WHEEL, 0600, "dcons");
+       cp->cn_probegood = 1;
 #elif __FreeBSD_version >= 501109
        ksprintf(cp->cn_name, "dcons");
 #else
@@ -416,11 +409,18 @@ dcons_cninit(struct consdev *cp)
 #if CONS_NODEV
        cp->cn_arg
 #else
-       cp->cn_dev->si_drv1
+       cp->cn_private
 #endif
                = (void *)&sc[DCONS_CON]; /* share port0 with unit0 */
 }
 
+static void
+dcons_cninit_fini(struct consdev *cp)
+{
+       cp->cn_dev = make_dev(&dcons_ops, DCONS_CON,
+                             UID_ROOT, GID_WHEEL, 0600, "dcons");
+}
+
 #if CONS_NODEV
 static int
 dcons_cngetc(struct consdev *cp)
@@ -442,21 +442,21 @@ dcons_cnputc(struct consdev *cp, int c)
 }
 #else
 static int
-dcons_cngetc(DEV dev)
+dcons_cngetc(void *private)
 {
-       struct dcons_softc *dc = (struct dcons_softc *)dev->si_drv1;
+       struct dcons_softc *dc = (struct dcons_softc *)private;
        return (dcons_os_getc(dc));
 }
 static int
-dcons_cncheckc(DEV dev)
+dcons_cncheckc(void *private)
 {
-       struct dcons_softc *dc = (struct dcons_softc *)dev->si_drv1;
+       struct dcons_softc *dc = (struct dcons_softc *)private;
        return (dcons_os_checkc(dc));
 }
 static void
-dcons_cnputc(DEV dev, int c)
+dcons_cnputc(void *private, int c)
 {
-       struct dcons_softc *dc = (struct dcons_softc *)dev->si_drv1;
+       struct dcons_softc *dc = (struct dcons_softc *)private;
        dcons_os_putc(dc, c);
 }
 #endif
@@ -523,23 +523,11 @@ dcons_drv_init(int stage)
 ok:
        dcons_buf = dg.buf;
 
-#if __FreeBSD_version < 502122
 #if DDB && DCONS_FORCE_GDB
-#if CONS_NODEV
-       gdbconsdev.cn_arg = (void *)&sc[DCONS_GDB];
-#if __FreeBSD_version >= 501109
-       ksprintf(gdbconsdev.cn_name, "dgdb");
-#endif
-       gdb_arg = &gdbconsdev;
-#elif defined(__DragonFly__)
-       gdbdev = make_dev(&dcons_ops, DCONS_GDB,
-           UID_ROOT, GID_WHEEL, 0600, "dgdb");
-#else
-       gdbdev = makedev(CDEV_MAJOR, DCONS_GDB);
-#endif
-       gdb_getc = dcons_cngetc;
-       gdb_putc = dcons_cnputc;
-#endif
+       if (gdb_tab == NULL) {
+               gdb_tab = &dcons_consdev;
+               dcons_consdev.cn_gdbprivate = &sc[DCONS_GDB];
+       }
 #endif
        drv_init = 1;
 
@@ -657,7 +645,8 @@ dcons_modevent(module_t mode, int type, void *data)
 #if CONS_NODEV
                gdb_arg = NULL;
 #else
-               gdbdev = NULL;
+               if (gdb_tab == &dcons_consdev)
+                       gdb_tab = NULL;
 #endif
 #endif
 #endif
index ff9f147..15a49c5 100644 (file)
@@ -29,7 +29,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: /usr/local/www/cvsroot/FreeBSD/src/sys/dev/syscons/syscons.c,v 1.336.2.17 2004/03/25 08:41:09 ru Exp $
- * $DragonFly: src/sys/dev/misc/syscons/syscons.c,v 1.31 2007/04/30 07:18:49 dillon Exp $
+ * $DragonFly: src/sys/dev/misc/syscons/syscons.c,v 1.32 2007/05/07 05:21:40 dillon Exp $
  */
 
 #include "use_splash.h"
@@ -181,14 +181,15 @@ static timeout_t blink_screen;
 
 static cn_probe_t      sccnprobe;
 static cn_init_t       sccninit;
+static cn_init_t       sccninit_fini;
 static cn_getc_t       sccngetc;
 static cn_checkc_t     sccncheckc;
 static cn_putc_t       sccnputc;
 static cn_dbctl_t      sccndbctl;
 static cn_term_t       sccnterm;
 
-CONS_DRIVER(sc, sccnprobe, sccninit, sccnterm, sccngetc, sccncheckc, sccnputc,
-           sccndbctl);
+CONS_DRIVER(sc, sccnprobe, sccninit, sccninit_fini, sccnterm,
+           sccngetc, sccncheckc, sccnputc, sccndbctl);
 
 static d_open_t        scopen;
 static d_close_t       scclose;
@@ -311,6 +312,24 @@ sc_attach_unit(int unit, int flags)
     }
 
     sc = sc_get_softc(unit, flags & SC_KERNEL_CONSOLE);
+
+    /*
+     * If this is the console we couldn't setup sc->dev before because
+     * malloc wasn't working.  Set it up now.
+     */
+    if (flags & SC_KERNEL_CONSOLE) {
+       KKASSERT(sc->dev == NULL);
+       sc->dev = kmalloc(sizeof(cdev_t)*sc->vtys, M_SYSCONS, M_WAITOK|M_ZERO);
+       sc->dev[0] = make_dev(&sc_ops, sc_console_unit*MAXCONS, UID_ROOT, 
+                             GID_WHEEL, 0600, 
+                             "ttyv%r", sc_console_unit*MAXCONS);
+       sc->dev[0]->si_tty = ttymalloc(sc->dev[0]->si_tty);
+       sc->dev[0]->si_drv1 = sc_console;
+    }
+
+    /*
+     * Finish up the standard attach
+     */
     sc->config = flags;
     callout_init(&sc->scrn_timer_ch);
     scp = SC_STAT(sc->dev[0]);
@@ -1334,8 +1353,7 @@ sccnprobe(struct consdev *cp)
        return;
 
     /* initialize required fields */
-    cp->cn_dev = make_dev(&sc_ops, SC_CONSOLECTL,
-                  UID_ROOT, GID_WHEEL, 0600, "consolectl");
+    cp->cn_probegood = 1;
 }
 
 static void
@@ -1347,7 +1365,14 @@ sccninit(struct consdev *cp)
     sc_get_cons_priority(&unit, &flags);
     scinit(unit, flags | SC_KERNEL_CONSOLE);
     sc_console_unit = unit;
-    sc_console = SC_STAT(sc_get_softc(unit, SC_KERNEL_CONSOLE)->dev[0]);
+    sc_console = sc_get_softc(unit, SC_KERNEL_CONSOLE)->console_scp;
+}
+
+static void
+sccninit_fini(struct consdev *cp)
+{
+    cp->cn_dev = make_dev(&sc_ops, SC_CONSOLECTL,
+                         UID_ROOT, GID_WHEEL, 0600, "consolectl");
 }
 
 static void
@@ -1368,7 +1393,7 @@ sccnterm(struct consdev *cp)
 }
 
 static void
-sccnputc(cdev_t dev, int c)
+sccnputc(void *private, int c)
 {
     u_char buf[1];
     scr_stat *scp = sc_console;
@@ -1409,19 +1434,19 @@ sccnputc(cdev_t dev, int c)
 }
 
 static int
-sccngetc(cdev_t dev)
+sccngetc(void *private)
 {
     return sccngetch(0);
 }
 
 static int
-sccncheckc(cdev_t dev)
+sccncheckc(void *private)
 {
     return sccngetch(SCGETC_NONBLOCK);
 }
 
 static void
-sccndbctl(cdev_t dev, int on)
+sccndbctl(void *private, int on)
 {
     /* assert(sc_console_unit >= 0) */
     /* try to switch to the kernel console screen */
@@ -2440,8 +2465,6 @@ scinit(int unit, int flags)
      * but is necessry evil for the time being.  XXX
      */
     static scr_stat main_console;
-    static cdev_t main_devs[MAXCONS];
-    static struct tty main_tty;
     static u_short sc_buffer[ROW*COL]; /* XXX */
 #ifndef SC_NO_FONT_LOADING
     static u_char font_8[256*8];
@@ -2520,12 +2543,8 @@ scinit(int unit, int flags)
        sc->first_vty = unit*MAXCONS;
        sc->vtys = MAXCONS;             /* XXX: should be configurable */
        if (flags & SC_KERNEL_CONSOLE) {
-           sc->dev = main_devs;
-           sc->dev[0] = make_dev(&sc_ops, unit*MAXCONS, UID_ROOT, 
-                               GID_WHEEL, 0600, "ttyv%r", unit*MAXCONS);
-           sc->dev[0]->si_tty = &main_tty;
-           ttyregister(&main_tty);
            scp = &main_console;
+           sc->console_scp = scp;
            init_scp(sc, sc->first_vty, scp);
            sc_vtb_init(&scp->vtb, VTB_MEMORY, scp->xsize, scp->ysize,
                        (void *)sc_buffer, FALSE);
@@ -2541,8 +2560,8 @@ scinit(int unit, int flags)
                                GID_WHEEL, 0600, "ttyv%r", unit*MAXCONS);
            sc->dev[0]->si_tty = ttymalloc(sc->dev[0]->si_tty);
            scp = alloc_scp(sc, sc->first_vty);
+           sc->dev[0]->si_drv1 = scp;
        }
-       sc->dev[0]->si_drv1 = scp;
        sc->cur_scp = scp;
 
        /* copy screen to temporary buffer */
@@ -2659,8 +2678,14 @@ scterm(int unit, int flags)
     if (sc->adapter >= 0)
        vid_release(sc->adp, &sc->adapter);
 
-    /* stop the terminal emulator, if any */
-    scp = SC_STAT(sc->dev[0]);
+    /* 
+     * Stop the terminal emulator, if any.  If operating on the
+     * kernel console sc->dev may not be setup yet.
+     */
+    if (flags & SC_KERNEL_CONSOLE)
+       scp = sc->console_scp;
+    else
+       scp = SC_STAT(sc->dev[0]);
     if (scp->tsw)
        (*scp->tsw->te_term)(scp, &scp->ts);
     if (scp->ts != NULL)
index 02aebe0..11acc1c 100644 (file)
@@ -29,7 +29,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/syscons/syscons.h,v 1.60.2.6 2002/09/15 22:30:45 dd Exp $
- * $DragonFly: src/sys/dev/misc/syscons/syscons.h,v 1.18 2006/12/22 23:26:18 swildner Exp $
+ * $DragonFly: src/sys/dev/misc/syscons/syscons.h,v 1.19 2007/05/07 05:21:40 dillon Exp $
  */
 
 #ifndef _DEV_SYSCONS_SYSCONS_H_
@@ -202,6 +202,7 @@ typedef struct sc_softc {
        int             first_vty;
        int             vtys;
        cdev_t          *dev;
+       struct scr_stat *console_scp;
        struct scr_stat *cur_scp;
        struct scr_stat *new_scp;
        struct scr_stat *old_scp;
index c02bd8b..04a7cd3 100644 (file)
@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/isa/sio.c,v 1.291.2.35 2003/05/18 08:51:15 murray Exp $
- * $DragonFly: src/sys/dev/serial/sio/sio.c,v 1.39 2007/04/12 18:35:09 swildner Exp $
+ * $DragonFly: src/sys/dev/serial/sio/sio.c,v 1.40 2007/05/07 05:21:40 dillon Exp $
  *     from: @(#)com.c 7.5 (Berkeley) 5/16/91
  *     from: i386/isa sio.c,v 1.234
  */
@@ -2731,13 +2731,14 @@ static void siocntxwait (Port_t iobase);
 
 static cn_probe_t siocnprobe;
 static cn_init_t siocninit;
+static cn_init_fini_t siocninit_fini;
 static cn_checkc_t siocncheckc;
 static cn_getc_t siocngetc;
 static cn_putc_t siocnputc;
 
 #ifdef __i386__
-CONS_DRIVER(sio, siocnprobe, siocninit, NULL, siocngetc, siocncheckc,
-           siocnputc, NULL);
+CONS_DRIVER(sio, siocnprobe, siocninit, siocninit_fini,
+           NULL, siocngetc, siocncheckc, siocnputc, NULL);
 #endif
 
 /* To get the GDB related variables */
@@ -2925,25 +2926,21 @@ siocnprobe(struct consdev *cp)
 
                        crit_exit();
                        if (COM_CONSOLE(flags) && !COM_LLCONSOLE(flags)) {
-                               cp->cn_dev = make_dev(&sio_ops, unit,
-                                               UID_ROOT, GID_WHEEL, 0600,
-                                               "ttyd%r", unit);
+                               cp->cn_probegood = 1;
+                               cp->cn_private = (void *)unit;
                                cp->cn_pri = COM_FORCECONSOLE(flags)
                                             || boothowto & RB_SERIAL
                                             ? CN_REMOTE : CN_NORMAL;
                                siocniobase = iobase;
                                siocnunit = unit;
                        }
-                       if (COM_DEBUGGER(flags)) {
+                       if (COM_DEBUGGER(flags) && gdb_tab == NULL) {
                                kprintf("sio%d: gdb debugging port\n", unit);
                                siogdbiobase = iobase;
                                siogdbunit = unit;
 #if DDB > 0
-                               gdbdev = make_dev(&sio_ops, unit,
-                                               UID_ROOT, GID_WHEEL, 0600,
-                                               "ttyd%r", unit);
-                               gdb_getc = siocngetc;
-                               gdb_putc = siocnputc;
+                               cp->cn_gdbprivate = (void *)unit;
+                               gdb_tab = cp;
 #endif
                        }
                }
@@ -2955,18 +2952,15 @@ siocnprobe(struct consdev *cp)
         * If no gdb port has been specified, set it to be the console
         * as some configuration files don't specify the gdb port.
         */
-       if (gdbdev == NOCDEV && (boothowto & RB_GDB)) {
+       if (gdb_tab == NULL && (boothowto & RB_GDB)) {
                kprintf("Warning: no GDB port specified. Defaulting to sio%d.\n",
                        siocnunit);
                kprintf("Set flag 0x80 on desired GDB port in your\n");
                kprintf("configuration file (currently sio only).\n");
                siogdbiobase = siocniobase;
                siogdbunit = siocnunit;
-               gdbdev = make_dev(&sio_ops, siocnunit,
-                               UID_ROOT, GID_WHEEL, 0600,
-                               "ttyd%r", siocnunit);
-               gdb_getc = siocngetc;
-               gdb_putc = siocnputc;
+               cp->cn_gdbprivate = (void *)siocnunit;
+               gdb_tab = cp;
        }
 #endif
 #endif
@@ -2975,17 +2969,32 @@ siocnprobe(struct consdev *cp)
 static void
 siocninit(struct consdev *cp)
 {
-       comconsole = DEV_TO_UNIT(cp->cn_dev);
+       comconsole = (int)(intptr_t)cp->cn_private;
+}
+
+static void
+siocninit_fini(struct consdev *cp)
+{
+       int unit;
+
+       kprintf("CP %d\n", cp->cn_probegood);
+       if (cp->cn_probegood) {
+               unit = (int)(intptr_t)cp->cn_private;
+               cp->cn_dev = make_dev(&sio_ops, unit,
+                                     UID_ROOT, GID_WHEEL, 0600,
+                                     "ttyd%r", unit);
+       }
 }
 
 static int
-siocncheckc(cdev_t dev)
+siocncheckc(void *private)
 {
        int     c;
+       int     unit = (int)(intptr_t)private;
        Port_t  iobase;
        struct siocnstate       sp;
 
-       if (minor(dev) == siogdbunit)
+       if (unit == siogdbunit)
                iobase = siogdbiobase;
        else
                iobase = siocniobase;
@@ -3002,13 +3011,14 @@ siocncheckc(cdev_t dev)
 
 
 int
-siocngetc(cdev_t dev)
+siocngetc(void *private)
 {
        int     c;
+       int     unit = (int)(intptr_t)private;
        Port_t  iobase;
        struct siocnstate       sp;
 
-       if (minor(dev) == siogdbunit)
+       if (unit == siogdbunit)
                iobase = siogdbiobase;
        else
                iobase = siocniobase;
@@ -3023,12 +3033,13 @@ siocngetc(cdev_t dev)
 }
 
 void
-siocnputc(cdev_t dev, int c)
+siocnputc(void *private, int c)
 {
+       int     unit = (int)(intptr_t)private;
        struct siocnstate       sp;
        Port_t  iobase;
 
-       if (minor(dev) == siogdbunit)
+       if (unit == siogdbunit)
                iobase = siogdbiobase;
        else
                iobase = siocniobase;
index 2fe5e20..e4bff4e 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     from: @(#)cons.c        7.2 (Berkeley) 5/9/91
  * $FreeBSD: src/sys/kern/tty_cons.c,v 1.81.2.4 2001/12/17 18:44:41 guido Exp $
- * $DragonFly: src/sys/kern/tty_cons.c,v 1.20 2007/01/08 03:33:41 dillon Exp $
+ * $DragonFly: src/sys/kern/tty_cons.c,v 1.21 2007/05/07 05:21:41 dillon Exp $
  */
 
 #include "opt_ddb.h"
@@ -104,12 +104,14 @@ static u_char cn_is_open;         /* nonzero if logical console is open */
 static int openmode, openflag;         /* how /dev/console was openned */
 static cdev_t cn_devfsdev;             /* represents the device private info */
 static u_char cn_phys_is_open;         /* nonzero if physical device is open */
-       struct consdev *cn_tab;         /* physical console device info */
 static u_char console_pausing;         /* pause after each line during probe */
 static char *console_pausestr=
 "<pause; press any key to proceed to next line or '.' to end pause mode>";
 
-CONS_DRIVER(cons, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+struct consdev *cn_tab;                /* physical console device info */
+struct consdev *gdb_tab;       /* physical gdb debugger device info */
+
+CONS_DRIVER(cons, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
 SET_DECLARE(cons_set, struct consdev);
 
 void
@@ -126,7 +128,7 @@ cninit(void)
                if (cp->cn_probe == NULL)
                        continue;
                (*cp->cn_probe)(cp);
-               if (cp->cn_pri > CN_DEAD &&
+               if (cp->cn_pri > CN_DEAD && cp->cn_probegood &&
                    (best_cp == NULL || cp->cn_pri > best_cp->cn_pri))
                        best_cp = cp;
        }
@@ -177,6 +179,15 @@ cninit_finish(void)
        if ((cn_tab == NULL) || cn_mute)
                return;
 
+       if (cn_tab->cn_dev == NULL) {
+               cn_tab->cn_init_fini(cn_tab);
+       }
+       if (cn_tab->cn_dev == NULL) {
+               kprintf("Unable to hook console open and close! cn_tab %p\n",
+                       cn_tab);
+               return;
+       }
+
        /*
         * Hook the open and close functions.  XXX bad hack.
         */
index 1556278..48f7d1b 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/platform/vkernel/platform/console.c,v 1.12 2007/02/01 20:53:19 corecode Exp $
+ * $DragonFly: src/sys/platform/vkernel/platform/console.c,v 1.13 2007/05/07 05:21:42 dillon Exp $
  */
 
 #include <sys/systm.h>
@@ -220,12 +220,13 @@ vcons_intr(void *tpx, struct intrframe *frame __unused)
  */
 static cn_probe_t      vconsprobe;
 static cn_init_t       vconsinit;
+static cn_init_fini_t  vconsinit_fini;
 static cn_term_t       vconsterm;
 static cn_getc_t       vconsgetc;
 static cn_checkc_t     vconscheckc;
 static cn_putc_t       vconsputc;
 
-CONS_DRIVER(vcons, vconsprobe, vconsinit, vconsterm, vconsgetc, 
+CONS_DRIVER(vcons, vconsprobe, vconsinit, vconsinit_fini, vconsterm, vconsgetc, 
                vconscheckc, vconsputc, NULL);
 
 static struct termios init_tio;
@@ -235,8 +236,7 @@ static void
 vconsprobe(struct consdev *cp)
 {
        cp->cn_pri = CN_NORMAL;
-       cp->cn_dev = make_dev(&vcons_ops, 255,
-                             UID_ROOT, GID_WHEEL, 0600, "vconsolectl");
+       cp->cn_probegood = 1;
 }
 
 /*
@@ -314,6 +314,14 @@ vconsinit(struct consdev *cp)
        vcons_set_mode(0);
 }
 
+static void
+vconsinit_fini(struct consdev *cp)
+{
+       cp->cn_dev = make_dev(&vcons_ops, 255,
+                             UID_ROOT, GID_WHEEL,
+                             0600, "vconsolectl");
+}
+
 static void
 vconsterm(struct consdev *vp)
 {
@@ -322,7 +330,7 @@ vconsterm(struct consdev *vp)
 }
 
 static int
-vconsgetc(cdev_t dev)
+vconsgetc(void *private)
 {
        unsigned char c;
        ssize_t n;
@@ -340,7 +348,7 @@ vconsgetc(cdev_t dev)
 }
 
 static int
-vconscheckc(cdev_t dev)
+vconscheckc(void *private)
 {
        unsigned char c;
 
@@ -350,7 +358,7 @@ vconscheckc(cdev_t dev)
 }
 
 static void
-vconsputc(cdev_t dev, int c)
+vconsputc(void *private, int c)
 {
        char cc = c;
 
index 0ff4fdb..663128c 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)conf.h      8.5 (Berkeley) 1/9/95
  * $FreeBSD: src/sys/sys/conf.h,v 1.103.2.6 2002/03/11 01:14:55 dd Exp $
- * $DragonFly: src/sys/sys/conf.h,v 1.15 2006/09/26 18:57:14 dillon Exp $
+ * $DragonFly: src/sys/sys/conf.h,v 1.16 2007/05/07 05:21:42 dillon Exp $
  */
 
 #ifndef _SYS_CONF_H_
@@ -46,6 +46,9 @@
 #include <sys/queue.h>
 #include <sys/time.h>
 #include <sys/biotrack.h>
+#ifndef _SYS_SYSREF_H_
+#include <sys/sysref.h>
+#endif
 
 #define SPECNAMELEN    15
 
@@ -65,6 +68,7 @@ struct cdev {
        struct dev_ops  *si_ops;        /* device operations vector */
        int             si_iosize_max;  /* maximum I/O size (for physio &al) */
        int             si_refs;
+       struct sysref   si_sysref;
        union {
                struct {
                        struct tty *__sit_tty;
index 6b31668..b9bb5f7 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     from: @(#)cons.h        7.2 (Berkeley) 5/9/91
  * $FreeBSD: src/sys/sys/cons.h,v 1.24 2000/01/11 14:54:01 yokota Exp $
- * $DragonFly: src/sys/sys/cons.h,v 1.6 2006/09/10 01:26:40 dillon Exp $
+ * $DragonFly: src/sys/sys/cons.h,v 1.7 2007/05/07 05:21:42 dillon Exp $
  */
 
 #ifndef _MACHINE_CONS_H_
@@ -51,30 +51,28 @@ struct consdev;
 
 typedef        void    cn_probe_t (struct consdev *);
 typedef        void    cn_init_t (struct consdev *);
+typedef        void    cn_init_fini_t (struct consdev *);
 typedef        void    cn_term_t (struct consdev *);
-typedef        int     cn_getc_t (cdev_t);
-typedef        int     cn_checkc_t (cdev_t);
-typedef        void    cn_putc_t (cdev_t, int);
-typedef        void    cn_dbctl_t (cdev_t, int);
+typedef        int     cn_getc_t (void *);
+typedef        int     cn_checkc_t (void *);
+typedef        void    cn_putc_t (void *, int);
+typedef        void    cn_dbctl_t (void *, int);
 
 struct consdev {
-       cn_probe_t      *cn_probe;
-                               /* probe hardware and fill in consdev info */
-       cn_init_t       *cn_init;
-                               /* turn on as console */
-       cn_term_t       *cn_term;
-                               /* turn off as console */
-       cn_getc_t       *cn_getc;
-                               /* kernel getchar interface */
-       cn_checkc_t     *cn_checkc;
-                               /* kernel "return char if available" interface */
-       cn_putc_t       *cn_putc;
-                               /* kernel putchar interface */
-       cn_dbctl_t      *cn_dbctl;
-                               /* debugger control interface */
+       cn_probe_t      *cn_probe;      /* probe hardware */
+       cn_init_t       *cn_init;       /* initialize for use */
+       cn_init_fini_t  *cn_init_fini;  /* tie in cdev_t */
+       cn_term_t       *cn_term;       /* terminate use as console */
+       cn_getc_t       *cn_getc;       /* kernel getchar interface */
+       cn_checkc_t     *cn_checkc;     /* kernel test char ready */
+       cn_putc_t       *cn_putc;       /* kernel putchar interface */
+       cn_dbctl_t      *cn_dbctl;      /* debugger control interface */
        struct  tty *cn_tp;     /* tty structure for console device */
-       cdev_t  cn_dev;         /* major/minor of device */
+       cdev_t  cn_dev;         /* device after cn_init_fini tie-in */
        short   cn_pri;         /* pecking order; the higher the better */
+       short   cn_probegood;   /* probe routine must set to non-zero */
+       void    *cn_private;    /* private data for get/check/put/dbctl */
+       void    *cn_gdbprivate; /* private data for gdb */
 };
 
 /* values for cn_pri - reflect our policy for console selection */
@@ -85,11 +83,12 @@ struct consdev {
 
 #ifdef _KERNEL
 extern int cons_unavail;
-extern struct consdev *cn_tab;
+extern struct consdev *cn_tab; /* console device */
+extern  struct consdev *gdb_tab;/* gdb debugger device */
 
-#define CONS_DRIVER(name, probe, init, term, getc, checkc, putc, dbctl)        \
+#define CONS_DRIVER(name, probe, init, initfini, term, getc, checkc, putc, dbctl)      \
        static struct consdev name##_consdev = {                        \
-               probe, init, term, getc, checkc, putc, dbctl            \
+               probe, init, initfini, term, getc, checkc, putc, dbctl  \
        };                                                              \
        DATA_SET(cons_set, name##_consdev)