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