MFC: Fix a panic on boot that can occur if you hit keys on the keyboard
authorMatthew Dillon <dillon@dragonflybsd.org>
Sun, 3 Aug 2008 03:00:58 +0000 (3 03:00 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Sun, 3 Aug 2008 03:00:58 +0000 (3 03:00 +0000)
     before the console device's high level initialization is run.

sys/dev/misc/syscons/syscons.c
sys/dev/misc/syscons/syscons.h

index 72ccc2b..948163f 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.33 2007/08/19 11:39:11 swildner Exp $
+ * $DragonFly: src/sys/dev/misc/syscons/syscons.c,v 1.33.4.1 2008/08/03 03:00:58 dillon Exp $
  */
 
 #include "use_splash.h"
@@ -120,8 +120,8 @@ SYSCTL_INT(_machdep, OID_AUTO, enable_panic_key, CTLFLAG_RW, &enable_panic_key,
 
 #define SC_CONSOLECTL  255
 
-#define VIRTUAL_TTY(sc, x) (SC_DEV((sc), (x)) != NULL ?        \
-       SC_DEV((sc), (x))->si_tty : NULL)
+#define VIRTUAL_TTY(sc, x) ((SC_DEV((sc),(x)) != NULL) ?       \
+       (SC_DEV((sc),(x))->si_tty) : NULL)
 #define ISTTYOPEN(tp)  ((tp) && ((tp)->t_state & TS_ISOPEN))
 
 static int             debugger;
@@ -578,6 +578,9 @@ sckbdevent(keyboard_t *thiskbd, int event, void *arg)
     size_t len;
     u_char *cp;
 
+    /*
+     * WARNING: In early boot sc->dev may not be setup yet.
+     */
     sc = (sc_softc_t *)arg;
     /* assert(thiskbd == sc->kbd) */
 
@@ -599,7 +602,6 @@ sckbdevent(keyboard_t *thiskbd, int event, void *arg)
      * the Xaccel-2.1 keyboard hang, but it can't hurt.                XXX
      */
     while ((c = scgetc(sc, SCGETC_NONBLOCK)) != NOKEY) {
-
        cur_tty = VIRTUAL_TTY(sc, sc->cur_scp->index);
        if (!ISTTYOPEN(cur_tty)) {
            cur_tty = sc_console_tty;
index bbadac3..d199042 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.20 2007/08/19 11:39:11 swildner Exp $
+ * $DragonFly: src/sys/dev/misc/syscons/syscons.h,v 1.20.4.1 2008/08/03 03:00:58 dillon Exp $
  */
 
 #ifndef _DEV_SYSCONS_SYSCONS_H_
@@ -89,7 +89,7 @@ MALLOC_DECLARE(M_SYSCONS);
 
 #define SC_DRIVER_NAME "sc"
 #define SC_VTY(dev)    minor(dev)
-#define SC_DEV(sc, vty)        ((sc)->dev[(vty) - (sc)->first_vty])
+#define SC_DEV(sc, vty)        ((sc)->dev ? (sc)->dev[(vty) - (sc)->first_vty] : NULL)
 #define SC_STAT(dev)   ((scr_stat *)(dev)->si_drv1)
 
 /* printable chars */