DEVFS - remove dev_ops_add(), dev_ops_get(), and get_dev()
[dragonfly.git] / sys / dev / misc / dcons / dcons_os.c
index 9d5f72a..f684a71 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.13 2007/08/07 13:14:11 hasso Exp $
  */
 
 #include <sys/param.h>
@@ -50,6 +50,7 @@
 #include <sys/tty.h>
 #include <sys/malloc.h>
 #include <sys/proc.h>
+#include <sys/priv.h>
 #include <sys/thread2.h>
 #include <sys/ucred.h>
 #include <sys/bus.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;
@@ -107,6 +101,7 @@ static struct dev_ops dcons_ops = {
        .d_write =      ttywrite,
        .d_ioctl =      dcons_ioctl,
        .d_poll =       ttypoll,
+       .d_revoke =     ttyrevoke
 };
 
 #ifndef KLD_MODULE
@@ -147,12 +142,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;
@@ -278,7 +274,7 @@ dcons_open(struct dev_open_args *ap)
                tp->t_lflag = TTYDEF_LFLAG;
                tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED;
                ttsetwater(tp);
-       } else if ((tp->t_state & TS_XCLUDE) && suser_cred(ap->a_cred, 0)) {
+       } else if ((tp->t_state & TS_XCLUDE) && priv_check_cred(ap->a_cred, PRIV_ROOT, 0)) {
                crit_exit();
                return (EBUSY);
        }
@@ -395,8 +391,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 +411,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 +444,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 +525,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;
 
@@ -577,9 +567,6 @@ dcons_attach(void)
 {
        int polltime;
 
-#ifdef __DragonFly__
-       dev_ops_add(&dcons_ops, -1, 0);
-#endif
        dcons_attach_port(DCONS_CON, "dcons", 0);
        dcons_attach_port(DCONS_GDB, "dgdb", DC_GDB);
 #if __FreeBSD_version < 500000
@@ -608,10 +595,7 @@ dcons_detach(int port)
                kprintf("dcons: still opened\n");
 #if __FreeBSD_version < 502113
                (*linesw[tp->t_line].l_close)(tp, 0);
-               tp->t_gen++;
                ttyclose(tp);
-               ttwakeup(tp);
-               ttwwakeup(tp);
 #else
                ttyld_close(tp, 0);
                tty_close(tp);
@@ -657,7 +641,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