Author: ray
Date: Mon Apr  7 22:49:41 2014
New Revision: 264244
URL: http://svnweb.freebsd.org/changeset/base/264244

Log:
  Fix panic on load new driver while vt(4) is in VGA textmode.
  o Mute terminal while vt(4) driver change in progress.
  o Reset VDF_TEXTMODE before init new driver.
  o Assign default font, if new driver is not in TEXTMODE.
  o Do not update screen while driver changing.
  
  Resolved by:  adrian
  Reported by:  tyler
  MFC after:    7 days
  Sponsored by: The FreeBSD Foundation

Modified:
  head/sys/dev/vt/vt_core.c

Modified: head/sys/dev/vt/vt_core.c
==============================================================================
--- head/sys/dev/vt/vt_core.c   Mon Apr  7 22:40:29 2014        (r264243)
+++ head/sys/dev/vt/vt_core.c   Mon Apr  7 22:49:41 2014        (r264244)
@@ -705,8 +705,8 @@ vt_bitblt_char(struct vt_device *vd, str
 static void
 vt_flush(struct vt_device *vd)
 {
-       struct vt_window *vw = vd->vd_curwindow;
-       struct vt_font *vf = vw->vw_font;
+       struct vt_window *vw;
+       struct vt_font *vf;
        struct vt_bufmask tmask;
        unsigned int row, col;
        term_rect_t tarea;
@@ -717,6 +717,11 @@ vt_flush(struct vt_device *vd)
        int bpl, h, w;
 #endif
 
+       vw = vd->vd_curwindow;
+       if (vw == NULL) return;
+       vf = vw->vw_font;
+       if ((vf == NULL) && !(vd->vd_flags & VDF_TEXTMODE)) return;
+
        if (vd->vd_flags & VDF_SPLASH || vw->vw_flags & VWF_BUSY)
                return;
 
@@ -794,6 +799,7 @@ vt_timer(void *arg)
        vd = arg;
        /* Update screen if required. */
        vt_flush(vd);
+
        /* Schedule for next update. */
        callout_schedule(&vd->vd_timer, hz / VT_TIMERFREQ);
 }
@@ -1882,6 +1888,10 @@ vt_upgrade(struct vt_device *vd)
                            vt_window_switch, vw, SHUTDOWN_PRI_DEFAULT);
                }
                terminal_maketty(vw->vw_terminal, "v%r", VT_UNIT(vw));
+
+               /* Assign default font to window, if not textmode. */
+               if (!(vd->vd_flags & VDF_TEXTMODE) && vw->vw_font == NULL)
+                       vw->vw_font = vtfont_ref(&vt_font_default);
        }
        if (vd->vd_curwindow == NULL)
                vd->vd_curwindow = vd->vd_windows[VT_CONSWINDOW];
@@ -1933,9 +1943,21 @@ vt_allocate(struct vt_driver *drv, void 
        if (drv->vd_maskbitbltchr == NULL)
                drv->vd_maskbitbltchr = drv->vd_bitbltchr;
 
-       /* Stop vt_flush periodic task. */
-       if (vd->vd_curwindow != NULL)
+       if (vd->vd_flags & VDF_ASYNC) {
+               /* Stop vt_flush periodic task. */
                callout_drain(&vd->vd_timer);
+               /*
+                * Mute current terminal until we done. vt_change_font (called
+                * from vt_resize) will unmute it.
+                */
+               terminal_mute(vd->vd_curwindow->vw_terminal, 1);
+       }
+
+       /*
+        * Reset VDF_TEXTMODE flag, driver who require that flag (vt_vga) will
+        * set it.
+        */
+       vd->vd_flags &= ~VDF_TEXTMODE;
 
        vd->vd_driver = drv;
        vd->vd_softc = softc;
@@ -1951,7 +1973,7 @@ vt_allocate(struct vt_driver *drv, void 
                vtterm_splash(vd);
 #endif
 
-       if (vd->vd_curwindow != NULL)
+       if (vd->vd_flags & VDF_ASYNC)
                callout_schedule(&vd->vd_timer, hz / VT_TIMERFREQ);
 
        termcn_cnregister(vd->vd_windows[VT_CONSWINDOW]->vw_terminal);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to