summaryrefslogtreecommitdiffstats
path: root/main/linux-pae/x86-setup-When-restoring-the-screen-update-boot_params-screen_info.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/linux-pae/x86-setup-When-restoring-the-screen-update-boot_params-screen_info.patch')
-rw-r--r--main/linux-pae/x86-setup-When-restoring-the-screen-update-boot_params-screen_info.patch48
1 files changed, 48 insertions, 0 deletions
diff --git a/main/linux-pae/x86-setup-When-restoring-the-screen-update-boot_params-screen_info.patch b/main/linux-pae/x86-setup-When-restoring-the-screen-update-boot_params-screen_info.patch
new file mode 100644
index 000000000..a4f94d7fa
--- /dev/null
+++ b/main/linux-pae/x86-setup-When-restoring-the-screen-update-boot_params-screen_info.patch
@@ -0,0 +1,48 @@
+From f1f6baf8f1df29be38003089787e378567ce0086 Mon Sep 17 00:00:00 2001
+From: H. Peter Anvin <hpa@zytor.com>
+Date: Wed, 17 Feb 2010 18:32:06 -0800
+Subject: [PATCH] x86, setup: When restoring the screen, update boot_params.screen_info
+
+When we restore the screen content after a mode change, we return the
+cursor to its former position. However, we need to also update
+boot_params.screen_info accordingly, so that the decompression code
+knows where on the screen the cursor is. Just in case the video BIOS
+does something extra screwy, read the cursor position back from the
+BIOS instead of relying on it doing the right thing.
+
+While we're at it, make sure we cap the cursor position to the new
+screen coordinates.
+
+Reported-by: Wim Osterholt <wim@djo.tudelft.nl>
+Bugzilla-Reference: http://bugzilla.kernel.org/show_bug.cgi?id=15329
+Signed-off-by: H. Peter Anvin <hpa@zytor.com>
+---
+ arch/x86/boot/video.c | 7 +++++++
+ 1 files changed, 7 insertions(+), 0 deletions(-)
+
+diff --git a/arch/x86/boot/video.c b/arch/x86/boot/video.c
+index f767164..43eda28 100644
+--- a/arch/x86/boot/video.c
++++ b/arch/x86/boot/video.c
+@@ -298,11 +298,18 @@ static void restore_screen(void)
+ }
+
+ /* Restore cursor position */
++ if (saved.curx >= xs)
++ saved.curx = xs-1;
++ if (saved.cury >= ys)
++ saved.cury = ys-1;
++
+ initregs(&ireg);
+ ireg.ah = 0x02; /* Set cursor position */
+ ireg.dh = saved.cury;
+ ireg.dl = saved.curx;
+ intcall(0x10, &ireg, NULL);
++
++ store_cursor_position();
+ }
+
+ void set_video(void)
+--
+1.7.1
+