Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 14 Apr 2014 12:40:38 +0000 (UTC)
From:      Aleksandr Rybalko <ray@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r264455 - in stable/10/sys: dev/vt kern
Message-ID:  <201404141240.s3ECeckX028543@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ray
Date: Mon Apr 14 12:40:37 2014
New Revision: 264455
URL: http://svnweb.freebsd.org/changeset/base/264455

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/10/sys/dev/vt/vt_core.c
  stable/10/sys/kern/subr_terminal.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/vt/vt_core.c
==============================================================================
--- stable/10/sys/dev/vt/vt_core.c	Mon Apr 14 09:36:15 2014	(r264454)
+++ stable/10/sys/dev/vt/vt_core.c	Mon Apr 14 12:40:37 2014	(r264455)
@@ -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/10/sys/kern/subr_terminal.c
==============================================================================
--- stable/10/sys/kern/subr_terminal.c	Mon Apr 14 09:36:15 2014	(r264454)
+++ stable/10/sys/kern/subr_terminal.c	Mon Apr 14 12:40:37 2014	(r264455)
@@ -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));
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201404141240.s3ECeckX028543>