| From d4d0ad57b3865795c4cde2fb5094c594c2e8f469 Mon Sep 17 00:00:00 2001 |
| From: "Maciej W. Rozycki" <macro@orcam.me.uk> |
| Date: Thu, 13 May 2021 11:51:41 +0200 |
| Subject: vgacon: Record video mode changes with VT_RESIZEX |
| |
| From: Maciej W. Rozycki <macro@orcam.me.uk> |
| |
| commit d4d0ad57b3865795c4cde2fb5094c594c2e8f469 upstream. |
| |
| Fix an issue with VGA console font size changes made after the initial |
| video text mode has been changed with a user tool like `svgatextmode' |
| calling the VT_RESIZEX ioctl. As it stands in that case the original |
| screen geometry continues being used to validate further VT resizing. |
| |
| Consequently when the video adapter is firstly reprogrammed from the |
| original say 80x25 text mode using a 9x16 character cell (720x400 pixel |
| resolution) to say 80x37 text mode and the same character cell (720x592 |
| pixel resolution), and secondly the CRTC character cell updated to 9x8 |
| (by loading a suitable font with the KD_FONT_OP_SET request of the |
| KDFONTOP ioctl), the VT geometry does not get further updated from 80x37 |
| and only upper half of the screen is used for the VT, with the lower |
| half showing rubbish corresponding to whatever happens to be there in |
| the video memory that maps to that part of the screen. Of course the |
| proportions change according to text mode geometries and font sizes |
| chosen. |
| |
| Address the problem then, by updating the text mode geometry defaults |
| rather than checking against them whenever the VT is resized via a user |
| ioctl. |
| |
| Signed-off-by: Maciej W. Rozycki <macro@orcam.me.uk> |
| Fixes: e400b6ec4ede ("vt/vgacon: Check if screen resize request comes from userspace") |
| Cc: stable@vger.kernel.org # v2.6.24+ |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/video/console/vgacon.c | 14 +++++++++++--- |
| 1 file changed, 11 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/video/console/vgacon.c |
| +++ b/drivers/video/console/vgacon.c |
| @@ -1174,12 +1174,20 @@ static int vgacon_resize(struct vc_data |
| if ((width << 1) * height > vga_vram_size) |
| return -EINVAL; |
| |
| + if (user) { |
| + /* |
| + * Ho ho! Someone (svgatextmode, eh?) may have reprogrammed |
| + * the video mode! Set the new defaults then and go away. |
| + */ |
| + screen_info.orig_video_cols = width; |
| + screen_info.orig_video_lines = height; |
| + vga_default_font_height = c->vc_font.height; |
| + return 0; |
| + } |
| if (width % 2 || width > screen_info.orig_video_cols || |
| height > (screen_info.orig_video_lines * vga_default_font_height)/ |
| c->vc_font.height) |
| - /* let svgatextmode tinker with video timings and |
| - return success */ |
| - return (user) ? 0 : -EINVAL; |
| + return -EINVAL; |
| |
| if (con_is_visible(c) && !vga_is_gfx) /* who knows */ |
| vgacon_doresize(c, width, height); |