Index: head/sys/dev/vt/vt.h =================================================================== --- head/sys/dev/vt/vt.h +++ head/sys/dev/vt/vt.h @@ -231,6 +231,7 @@ void vtbuf_dirty(struct vt_buf *vb, const term_rect_t *area); void vtbuf_undirty(struct vt_buf *, term_rect_t *); void vtbuf_sethistory_size(struct vt_buf *, unsigned int); +void vtbuf_clearhistory(struct vt_buf *); int vtbuf_iscursor(const struct vt_buf *vb, int row, int col); void vtbuf_cursor_visibility(struct vt_buf *, int); #ifndef SC_NO_CUTPASTE Index: head/sys/dev/vt/vt_buf.c =================================================================== --- head/sys/dev/vt/vt_buf.c +++ head/sys/dev/vt/vt_buf.c @@ -416,13 +416,26 @@ vb->vb_rows[r] = &vb->vb_buffer[r * vb->vb_scr_size.tp_col]; } -void -vtbuf_init_early(struct vt_buf *vb) +static void +vtbuf_do_clearhistory(struct vt_buf *vb) { term_rect_t rect; const teken_attr_t *a; - term_char_t c; + term_char_t ch; + a = teken_get_curattr(&vb->vb_terminal->tm_emulator); + ch = TCOLOR_FG(a->ta_fgcolor) | TCOLOR_BG(a->ta_bgcolor); + + rect.tr_begin.tp_row = rect.tr_begin.tp_col = 0; + rect.tr_end.tp_col = vb->vb_scr_size.tp_col; + rect.tr_end.tp_row = vb->vb_history_size; + + vtbuf_do_fill(vb, &rect, VTBUF_SPACE_CHAR(ch)); +} + +void +vtbuf_init_early(struct vt_buf *vb) +{ vb->vb_flags |= VBF_CURSOR; vb->vb_roffset = 0; vb->vb_curroffset = 0; @@ -432,14 +445,7 @@ vb->vb_mark_end.tp_col = 0; vtbuf_init_rows(vb); - rect.tr_begin.tp_row = rect.tr_begin.tp_col = 0; - rect.tr_end.tp_col = vb->vb_scr_size.tp_col; - rect.tr_end.tp_row = vb->vb_history_size; - - a = teken_get_curattr(&vb->vb_terminal->tm_emulator); - c = TCOLOR_FG((term_char_t)a->ta_fgcolor) | - TCOLOR_BG((term_char_t)a->ta_bgcolor); - vtbuf_do_fill(vb, &rect, VTBUF_SPACE_CHAR(c)); + vtbuf_do_clearhistory(vb); vtbuf_make_undirty(vb); if ((vb->vb_flags & VBF_MTX_INIT) == 0) { mtx_init(&vb->vb_lock, "vtbuf", NULL, MTX_SPIN); @@ -464,6 +470,14 @@ } vtbuf_init_early(vb); +} + +void +vtbuf_clearhistory(struct vt_buf *vb) +{ + VTBUF_LOCK(vb); + vtbuf_do_clearhistory(vb); + VTBUF_UNLOCK(vb); } void Index: head/sys/dev/vt/vt_core.c =================================================================== --- head/sys/dev/vt/vt_core.c +++ head/sys/dev/vt/vt_core.c @@ -2329,7 +2329,10 @@ if (*(int *)data != vd->vd_curwindow->vw_buf.vb_history_size) vtbuf_sethistory_size(&vd->vd_curwindow->vw_buf, *(int *)data); - return 0; + return (0); + case CONS_CLRHIST: + vtbuf_clearhistory(&vd->vd_curwindow->vw_buf); + return (0); case CONS_GET: /* XXX */ *(int *)data = M_CG640x480;