History log of /freebsd-10.1-release/sys/dev/vt/vt_buf.c
Revision Date Author Comments
(<<< Hide modified files)
(Show modified files >>>)
# 272461 02-Oct-2014 gjb

Copy stable/10@r272459 to releng/10.1 as part of
the 10.1-RELEASE process.

Approved by: re (implicit)
Sponsored by: The FreeBSD Foundation

# 271973 22-Sep-2014 dumbbell

vt(4): Merge several bug fixes and improvements

SVN revisions in this MFC:
271756 271758 271868 271871 271872 271899

Detailed commit list:

r271756:
vt(4): Fix out-of-bounds array access in VT_ACTIVATE ioctl handling

CID: 1229964

r271758
vt(4): Use strncpy() to copy into a fixed-size buffer

CID: 1230007

r271868:
vt(4): Remove vt_buf->vb_dirtymask

This structure and the associated functions were unused since the
implementation of vd_bitblt_text_t callbacks.

r271871:
vt(4): Rewrite history scrolling

It's now possible to scroll up the 500 hard-coded lines of history, not
just a fraction of them. For instance, one can reach the top of the boot
process.

Sometimes, when scrolling or when changing the screen size (by changing
the font or loading a KMS driver for instance), one could see the
history cycling (old content appeared below latest lines). This is
fixed.

Now, when the resolution changes are more lines can be shown, the
displayed area is adjusted so that, if the screen was filled with
content before, it's filled with content after as well: more history
is visible, instead of having blank lines below the previously visible
content.

r271872:
vt(4): Remove superfluous word in comment

Submitted by: brueffer@

r271899:
Make gcc happy by initialising the variable only set in a couple of
case statements without a default.

Approved by: re (marius)


# 271952 22-Sep-2014 ray

MFC 271381-271382,271385,271463-271466,271485,271506

o Add sysctls to enable/disable potentially dengerous key combinations, like
reboot/halt/debug.
o Add support for most key combinations supported by syscons(4).
o Some spelling fixes
o Remove stray whitespaces.
o Switch vt(4) to traditional behaviour with copy-paste same as syscons(4) do.
o Fix stray char on paste.
o Fix 'function declaration isn't a prototype' warning.
o vt(4): Enclose vt_mouse_paste() prototype inside #ifndef SC_NO_CUTPASTE/#endif

Approved by: re (gjb)
Sponsored by: The FreeBSD Foundation


# 271128 04-Sep-2014 emaste

MFC vt(4) improvements / sync with HEAD

These are largely dumbbell@'s changes. Most significantly they address
the extreme performance degradation with VGA hardware.

SVN revisions in this MFC:
269471 270290 270293 270322 270324 270329 270331 270336 270338 270340
270341 270342 270343 270388 270390 270404 270411 270412 270413 270431
270446 270448 270485 270587 270589 270613 270618 270620 270667 270702
270707 270708 270720 270721 270785 270786

Detailed commit list:

r270290: Test if the cursor is shown only once

Later, we just see if the "struct mouse_cursor" pointer is set. This
avoids the need to mess with all the conditions several times; this
has been error prone.

While here, rename the variable "m" to a more meaningful "cursor",
like it's done elsewhere in the code.

r270293: Rename the "mouse_cursor" structure to "vt_mouse_cursor"

At the same time, "w" and "h" members are now called "width" and
"height". The goal is to have a more "public" structure, because it
will soon be passed as argument to a new callback, replacing
vd_bitbltchr_t.

r269471 (ray):

Fix vt_vga driver to draw not-8-bit-aligned fonts correctly.
Still one bug here: mouse left some gaps on track when moving left.

r270322:

Add new vd_bitblt_text_t callback, and implement it for vt_vga

Compared to the deprecated vd_bitbltchr_t callback, vd_bitblt_text_t
receives:
o the whole text buffer
o the dirty area
o the mouse cursor (map, position, colors)

This allows the backend to perform optimization on how to draw things.
The goal is to remove vd_bitbltchr_t and vd_putchar_t, once all driver
are converted (only vt_vga is included in this commit).

In vt_vga, this allows to draw the text and the cursor in one pass,
without ever reading from video memory (because it has all the context).
The main benefit is the speed improvement: no more slideshow during
boot!

Other bugs fixed in vt_vga are:
o left-most characters are drawn properly (the left-most pixels were
missing with bold characters and some wide letters such as 'm')
o no more black square around the cursor
o no cursor flickering when the text is scrolling

There are still many problems to fix: the known issues are marked with
"FIXME" inside the code.

r270411:

vt_fb: Implement vd_bitblt_text_t for vt_fb and derivatives

r270412:

creator_fb: Implement vd_bitblt_text_t

r270413: ofwfb: Implement vd_bitblt_text_t

r270324: vt_vga: Clip the draw area to never draw offscreen

This fixes a bug when two windows use different fonts, but a longer-
term solution is required. The dirty area should be stored as pixels,
not character cells, because such coordinates don't have the same
meaning in all windows, when using different fonts.

r270329: Mark new mouse position as dirty only when it's actually displayed

r270331: Store cursor bitmap & colors in struct vt_device

This removes the need to specify them to each call to vd_bitblt_text_t
and, therefore, simplifies the API.

r270336: Give the window to vd_bitblt_text_t callback

... instead of both the buffer and the font. Again, this simplifies
the API.

r270338: The offset to center the text area is per-window now

The previous global offset, based on the last loaded font, had no
meaning for other windows. This caused a shifted text area, often
partly out-of-screen.

r270341: vt_vga: Remove a "FIXME" comment; the issue was solved in r270338

r270340: Don't run vt_set_border() and vt_flush() concurrently

In the case of vt_vga, the two concurrent calls were writing to the
same VGA registers, causing incorrect refresh of the screen.

r270342: Use the actual size of the mouse when marking its position as dirty

This fixes a bug where part of the cursor was not erased.

r270343: Remove "FIXME" about multiple locking of vt_buf in vt_flush()

After some testing, it appears that acquiring the lock once and keeping
it longer is slower than taking it multiple times.

While here, fix a typo in another comment.

r270388: vt_vga: Give only the character part of term_char_t to vga_get_cp437()

This fixes a bug where vga_get_cp437() was called with an invalid
argument. The screen was then filled with '?' instead of the actual
character.

r270390: Fix a crash in vt_mark_mouse_position_as_dirty() when in textmode

In textmode, no font is loaded, thus the page fault in
vt_mark_mouse_position_as_dirty() when it wants the font width/height.

For now, create a fake area for the textmode. This needs to be
modified if vt_vga gains mouse support in textmode.

While here, fix a build failure when SC_NO_CUTPASTE is defined:
vt_mark_mouse_position_as_dirty() must not be included in this case.

r270404: Fix cursor handling in vt_flush()

There were situations where the cursor was not erased/redrawn or its
position was marked as dirty even though it's not displayed. The code
is now more straightforward.

At the same, add a function to determine if the cursor covers a given
area. This is used by backends to know if they need to draw the
cursor.

This new function should be paired with a new state in struct
vt_device, called vd_mshown, which indicates if the cursor should be
displayed. This again simplifies vd_bitblt_text_t callback's API.

r270431: vt(4): Add vd_bitblt_bmp_t callback

The code was already there in all backends, we just expose it. This is
used to display the splash screen.

r270446: Remove vd_bitbltchr_t

It's replaced by vd_bitblt_text_t, which gives more context to the
backend and allows it to perform more efficiently when redrawing a
given area.

r270448: Fix order of arguments (x <-> y) when showing the splash screen

r270485: vt_vga: Fix the display of the splash screen

r270587: Take font offset into account in vt_is_cursor_in_area()

This fixes a "General protection fault" in vt_vga, where
vt_is_cursor_in_area() erroneously reported that the cursor was over
the text. This led to negative integers stored in "unsigned int" and
chaos.

r270589: The cursor coordinates are relative to the drawn area

... not the whole screen. Don't use font offsets in
vt_mark_mouse_position_as_dirty().

This fixes a bug where the mouse position wasn't marked as dirty when
approaching the borders of the drawn area.

r270613: Store a rectangle for the drawable area, not just the top-left corner

This allows backends to verify they do not draw outside of this area.
This fixes a bug in vt_vga where the text was happily drawn over the
right and bottom margins, when using the Gallant font.

r270618: Intialize drawable area rectangle each time a font is loaded

This also fixes a problem where early in boot, the area was zero,
leading to nothing displayed for a few seconds.

r270620: vt_vga: Use Write Mode 0 to draw group of 8 pixels using 3 or more colors

This replaces the method based on Write Mode 3, which required reads
from the video memory to load the latches.

r270667: When creating a window buffer, fill it entirely

... not just the visible part.

This fixes a bug where, when switching from eg. vt_vga to vt_fb (ie.
the resolution goes up), the originally hidden, uninitialized area of
the buffer is displayed on the screen. This leads to a missing text
cursor when it's over an unitialized area.

This was also visible when selecting text: the uninitialized area was
not highlighted.

Internally, this area was zeroed: characters were all 0x00000000,
meaning the foreground and background color was black. Now, everything
is filled with a space with a gray foreground color, like the visible
area.

While here, remove the check for the mute flag and always use
TERMINAL_NORM_ATTR as the character attribute (ie. gray foreground,
black background).

r270702: Implement basic support for KDSETMODE ioctl

With the current implementation, this allows an X11 server to tell
the console it switches a particular window in "graphics mode". This
information is used by the mouse handling code to ignore sysmouse events
in the window taken by the X server: only him should receive those
events.

r270707: Pause the vt_flush() timer when the screen is up-to-date

The timer is restarted whenever a window buffer is marked as dirty or
the mouse cursor moves.

There's still room for improvement. For instance, we should not mark a
window buffer as dirty when this window isn't displayed.

r270708: vt(4): Recompute the drawable area when the resolution changes

This was only done when the font changed.

r270720: vt(4): Fix mouse cursor handling in vt_fb/creator_vt/ofwfb

There were two issues:
1. The area given to vt_is_cursor_in_area() was adding the drawable
area offset, something already handled by this function.
2. The cursor was shifted on the screen by the offset of this area
and thus was misplaced or not erased. Furthermore, when reaching
the bottom or right borders, the cursor was either totally
removed or not erased correctly.

r270721: vt(4): If the terminal shrinks, make sure the mouse is inside
the new area

r270785: vt(4): Change vb_history_size from "int" to "unsigned int"

CID: 1230002, 1230003

r270786: Indicate that KDSETRAD case falls through the next case

CID: 1229953

Relnotes: Yes


# 271024 03-Sep-2014 emaste

MFC r270288 by dumbbell: vt(4): Constify vt_buf argument of vtbuf_iscursor()

Sponsored by: The FreeBSD Foundation


# 270182 19-Aug-2014 dumbbell

vt(4): Add vtbuf_dirty*_locked() to lock vtbuf once, not twice

In several functions, vtbuf_putchar() in particular, the lock on vtbuf
is acquired twice:
1. once by the said functions;
2. once in vtbuf_dirty().

Now, vtbuf_dirty_locked() and vtbuf_dirty_cell_locked() allow to
acquire that lock only once.

This improves the input speed of vt(4). To measure the gain, a
50,000-lines file was displayed on the console using cat(1). The time
taken by cat(1) is reported below:
o On amd64, with vt_vga:
- before: 1.0"
- after: 0.5"
o On sparc64, with creator_vt:
- before: 13.6"
- after: 10.5"

This is an MFC of r269780.


# 268037 30-Jun-2014 marius

MFC: r267978

In order to get vt(4) a bit closer to the feature set provided by sc(4),
implement options TERMINAL_{KERN,NORM}_ATTR. These are aliased to
SC_{KERNEL_CONS,NORM}_ATTR and like these latter, allow to change the
default colors of normal and kernel text respectively.
Note on the naming: Although affecting the output of vt(4), technically
kern/subr_terminal.c is primarily concerned with changing default colors
so it would be inconsistent to term these options VT_{KERN,NORM}_ATTR.
Actually, if the architecture and abstraction of terminal+teken+vt would
be perfect, dev/vt/* wouldn't be touched by this commit at all.

Reviewed by: emaste
Sponsored by: Bally Wulff Games & Entertainment GmbH


# 267538 16-Jun-2014 ray

MFC 262785 263183 264182 264999 265391 265392 265395 265397 265398 265402 265403
265442 265546 265680 265681 265719 265862 265864 265867 265927 266010 266495
266540 266835 266856 266861 266862 267007 267310.

265391
Define a new method for probing vt(4) driver before attach it at early stage.
265392
Create dataset for vt(4) drivers.
265395
Set of updates to vt(4) core part.
o Declare vt(4) drivers dataset.
o Create single static structures for all early drivers.
o Add vt(4) to be by default in the kernel consoles list.
o Create one more sysinit point, to be able to initialize memory and lock
requirement of early drivers.
o Implement early drivers select. (Only best available will be selected).
o Fix one missed "return (0)" for VTYLOCK.
o Improve locking for cases when one driver replace another.
o Make driver replacement notification less debug-look-like.
o Minor spell fixes.
265397
Switch fb and efifb drivers to use names and new vt(4) driver probe method.
265398
Add vt(4) driver name for ofwfb driver.
265402
Revert r264997 and r265026. It is not required anymore.
265403
Switch vga drivers to use names and new vt(4) driver probe method.
265442
Implement KDMKTONE ioctl.
265546
Fix possible divide by zero.
265680
No need to assign fields required and checked on probe.
265681
Fix scrollback.
265719
Hide debug messages under VT_DEBUG.
265927
Update terminal sizes in any case when new vt(4) driver arrive.
(Plus remove one unused newline)
266010
Remove extra newlines.
No functional changes.
266495
Fix tty locking.
o Correct expected values for VT_LOCKSWITCH ioctl.
o Check current window for locked state.
266540
Proper fix of VT_LOCKSWITCH ioctl.
266835
Remove driver as unused.
267007
Fix case when vt(4) started w/o driver assigned.
o Always init locks and cv ASAP.
o Initialize driver-independent parts even if driver probing fail.
o Allow to call vt_upgrade anytime, for later loaded drivers.
o New window flag VWF_READY, to track if window already initialized.
Other updates:
o Pass vd as a cookie for kbd_allocate.
o Do not blank window on driver replacement.

Sponsored by: The FreeBSD Foundation


# 262861 06-Mar-2014 jhb

MFC 259016,259019,259049,259071,259102,259110,259129,259130,259178,259179,
259203,259221,259261,259532,259615,259650,259651,259667,259680,259727,
259761,259772,259776,259777,259830,259882,259915,260160,260449,260450,
260688,260888,260953,261269,261547,261551,261552,261553,261585:
Merge the vt(4) driver (newcons) to stable/10.

Approved by: ray


# 259016 05-Dec-2013 ray

Merge VT(9) project (a.k.a. newcons).

Reviewed by: nwhitehorn
MFC_to_10_after: re approval

Sponsored by: The FreeBSD Foundation


# 258136 14-Nov-2013 ray

Done cut/paste "word" selection mode support.
It still selects everything which is not space around.

Sponsored by: The FreeBSD Foundation

Sponsored by: The FreeBSD Foundation


# 258134 14-Nov-2013 ray

wrap long lines.

Sponsored by: The FreeBSD Foundation
Sponsored by: The FreeBSD Foundation


# 258130 14-Nov-2013 ray

Save last mouse event and check if the button1-up event happen w/o movement,
then ignore it. Otherwise such events broke double/triple click sequence.

Sponsored by: The FreeBSD Foundation


# 258111 13-Nov-2013 ray

Simplify a bit vtbuf_set_mark.

Sponsored by: The FreeBSD Foundation


# 258093 13-Nov-2013 ray

Do not add <CR><LF> for last (single) line of paste buffer.

Sponsored by: The FreeBSD Foundation


# 258090 13-Nov-2013 ray

o Simplify POS_INDEX macro calculation.
o New macro POS_COPY to copy between term_pos_t.
o Add vtbuf_wth/vtbuf_htw helpers, to translate between screen coordinates and
circular history buffer location.
o Update vtbuf_iscursor to mark region selected by mouse.
o New helper vtbuf_flush_mark, to update regions where copy/paste mark changed.
o New method vtbuf_get_marked_len to get storage size for paste buffer.
o vtbuf_extract_marked fill (caller allocated buffer) with selected region data.
o Simplify mouse handler for copy/paste, and use vtbuf_flush_mark to update.
o New method vtbuf_scroll_mode, to help indicate Scroll mode by hiding cursor.
o Update header with new vtbuf methods.
o Add new vt_driver method vd_markedwin, to hold last window with selection.
o Enable paste support in core module.

Sponsored by: The FreeBSD Foundation
Pointed by: Claude Buisson <clbuisson@orange.fr> (Scroll mode indication)


# 257971 11-Nov-2013 ray

Add mouse related vtbuf operations.

Sponsored by: The FreeBSD Foundation


# 257547 02-Nov-2013 ray

Fix copyrights.

Sponsored by: The FreeBSD Foundation


# 257074 24-Oct-2013 ray

o Fix scroll calculations.
o Make vthistory_seek to return amount of lines to update +on_top/-on_bottom of
screen.

Sponsored by: The FreeBSD Foundation


# 256970 23-Oct-2013 ray

Turn off confusing rotation of scroll history.

Sponsored by: The FreeBSD Foundation


# 256894 22-Oct-2013 ray

Don't forget to clean terminal window memory. But colors makes more smiles.

Sponsored by: The FreeBSD Foundation


# 256145 08-Oct-2013 ray

o Implement history buffer.
o Join history buffer with screen buffer. Same type of things.
o Reimplement buffer as an array of rows. Make it circular, so no overflow
tracking.
o Implement VT_PROCESS mode. Locking of VT switching by owner process.
o Add debug and deadtimer sysctls. deadtimer - defaulting to 15 seconds, time
to wait process answer in VT_PROCESS mode, to do VT switch in case when
process hang.
o Implement later console attach.
o Fix (partially yet) keyboard allocation.
o Add drivers priority. Disallow to replace KMS driver with VGA.
o Add ability to resize terminals.

Sponsored by: The FreeBSD Foundation


# 219888 22-Mar-2011 ed

Readd the vt(4) driver and corresponding tools.