svn commit: r264456 - in stable/9/sys: dev/vt kern

Aleksandr Rybalko ray at FreeBSD.org
Mon Apr 14 12:49:19 UTC 2014


Author: ray
Date: Mon Apr 14 12:49:18 2014
New Revision: 264456
URL: http://svnweb.freebsd.org/changeset/base/264456

Log:
  MFC 264242,264244,264259
  
  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.
  o Unmute terminal when done with driver replacement.
  o Move init fonts to early point.
  o Minor cleanup.
  o Do not fill screen, while muted. (kern/subr_terminal.c)
  
  Sponsored by:	The FreeBSD Foundation

Modified:
  stable/9/sys/dev/vt/vt_core.c
  stable/9/sys/kern/subr_terminal.c
Directory Properties:
  stable/9/sys/   (props changed)
  stable/9/sys/dev/   (props changed)

Modified: stable/9/sys/dev/vt/vt_core.c
==============================================================================
--- stable/9/sys/dev/vt/vt_core.c	Mon Apr 14 12:40:37 2014	(r264455)
+++ stable/9/sys/dev/vt/vt_core.c	Mon Apr 14 12:49:18 2014	(r264456)
@@ -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,13 @@ vt_flush(struct vt_device *vd)
 	int bpl, h, w;
 #endif
 
+	vw = vd->vd_curwindow;
+	if (vw == NULL)
+		return;
+	vf = vw->vw_font;
+	if (((vd->vd_flags & VDF_TEXTMODE) == 0) && (vf == NULL))
+		return;
+
 	if (vd->vd_flags & VDF_SPLASH || vw->vw_flags & VWF_BUSY)
 		return;
 
@@ -794,6 +801,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 +1890,7 @@ vt_upgrade(struct vt_device *vd)
 			    vt_window_switch, vw, SHUTDOWN_PRI_DEFAULT);
 		}
 		terminal_maketty(vw->vw_terminal, "v%r", VT_UNIT(vw));
+
 	}
 	if (vd->vd_curwindow == NULL)
 		vd->vd_curwindow = vd->vd_windows[VT_CONSWINDOW];
@@ -1902,6 +1911,9 @@ vt_resize(struct vt_device *vd)
 
 	for (i = 0; i < VT_MAXWINDOWS; i++) {
 		vw = vd->vd_windows[i];
+		/* 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);
 		/* Resize terminal windows */
 		vt_change_font(vw, vw->vw_font);
 	}
@@ -1933,9 +1945,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,8 +1975,10 @@ vt_allocate(struct vt_driver *drv, void 
 		vtterm_splash(vd);
 #endif
 
-	if (vd->vd_curwindow != NULL)
+	if (vd->vd_flags & VDF_ASYNC) {
+		terminal_mute(vd->vd_curwindow->vw_terminal, 0);
 		callout_schedule(&vd->vd_timer, hz / VT_TIMERFREQ);
+	}
 
 	termcn_cnregister(vd->vd_windows[VT_CONSWINDOW]->vw_terminal);
 

Modified: stable/9/sys/kern/subr_terminal.c
==============================================================================
--- stable/9/sys/kern/subr_terminal.c	Mon Apr 14 12:40:37 2014	(r264455)
+++ stable/9/sys/kern/subr_terminal.c	Mon Apr 14 12:49:18 2014	(r264456)
@@ -208,7 +208,7 @@ terminal_set_winsize_blank(struct termin
 		teken_set_winsize(&tm->tm_emulator, &r.tr_end);
 	TERMINAL_UNLOCK(tm);
 
-	if (blank != 0)
+	if ((blank != 0) && !(tm->tm_flags & TF_MUTE))
 		tm->tm_class->tc_fill(tm, &r, TCHAR_CREATE((teken_char_t)' ',
 		    &default_message));
 


More information about the svn-src-stable-9 mailing list