Blob Blame History Raw
From 52f633e72965e711be4d92928615f63b4cf9f429 Mon Sep 17 00:00:00 2001
From: Miki Mishael <mmishael@redhat.com>
Date: Tue, 7 Jan 2014 16:10:44 +0100
Subject: [PATCH] vgabios: Fix cirrus memory clear on mode switch.

RH-Author: Miki Mishael <mmishael@redhat.com>
Message-id: <1389111044-9237-1-git-send-email-mmishael@redhat.com>
Patchwork-id: 56530
O-Subject: [RHEL7.0 seabios PATCH] vgabios: Fix cirrus memory clear on mode switch.
Bugzilla: 979898
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
RH-Acked-by: Yan Vugenfirer <yvugenfi@redhat.com>
RH-Acked-by: Gal Hammer <ghammer@redhat.com>

From: Kevin O'Connor <kevin@koconnor.net>

The cirrus_clear_vram() code wasn't actually doing anything because of
a u8 overflow.  Fix that.

Fill with 0xff when performing a legacy cirrus mode switch (WinXP has
been observed to incorrectly render dialog boxes if the memory is
filled to 0).  This was the behavior of the original LGPL vgabios
code.  To support this, add mechanism (MF_LEGACY) to allow vga drivers
to detect if the mode switch is from vesa or int10.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>

BZ: https://bugzilla.redhat.com/show_bug.cgi?id=979898
Upstream-status: b7b92935df0e309149c042d587e4764548f10608
Brew: https://brewweb.devel.redhat.com/taskinfo?taskID=6818682
Signed-off-by: Miki Mishael <mmishael@redhat.com>
Signed-off-by: Dmitry Fleytman <dfleytma@redhat.com>
---
 vgasrc/clext.c   | 11 ++++++-----
 vgasrc/vgabios.c |  2 +-
 vgasrc/vgabios.h |  1 +
 3 files changed, 8 insertions(+), 6 deletions(-)

Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
---
 vgasrc/clext.c   |   11 ++++++-----
 vgasrc/vgabios.c |    2 +-
 vgasrc/vgabios.h |    1 +
 3 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/vgasrc/clext.c b/vgasrc/clext.c
index fc5459a..30da499 100644
--- a/vgasrc/clext.c
+++ b/vgasrc/clext.c
@@ -442,14 +442,14 @@ cirrus_enable_16k_granularity(void)
 }
 
 static void
-cirrus_clear_vram(void)
+cirrus_clear_vram(u16 fill)
 {
     cirrus_enable_16k_granularity();
-    u8 count = GET_GLOBAL(VBE_total_memory) / (16 * 1024);
-    u8 i;
+    int count = GET_GLOBAL(VBE_total_memory) / (16 * 1024);
+    int i;
     for (i=0; i<count; i++) {
         stdvga_grdc_write(0x09, i);
-        memset16_far(SEG_GRAPH, 0, 0, 16 * 1024);
+        memset16_far(SEG_GRAPH, 0, fill, 16 * 1024);
     }
     stdvga_grdc_write(0x09, 0x00);
 }
@@ -468,7 +468,8 @@ clext_set_mode(struct vgamode_s *vmode_g, int flags)
     if (!(flags & MF_LINEARFB))
         cirrus_enable_16k_granularity();
     if (!(flags & MF_NOCLEARMEM))
-        cirrus_clear_vram();
+        // fill with 0xff to keep win 2K happy
+        cirrus_clear_vram(flags & MF_LEGACY ? 0xffff : 0x0000);
     return 0;
 }
 
diff --git a/vgasrc/vgabios.c b/vgasrc/vgabios.c
index afaf018..0ed8874 100644
--- a/vgasrc/vgabios.c
+++ b/vgasrc/vgabios.c
@@ -420,7 +420,7 @@ handle_1000(struct bregs *regs)
     else
         regs->al = 0x30;
 
-    int flags = GET_BDA(modeset_ctl) & (MF_NOPALETTE|MF_GRAYSUM);
+    int flags = MF_LEGACY | (GET_BDA(modeset_ctl) & (MF_NOPALETTE|MF_GRAYSUM));
     if (regs->al & 0x80)
         flags |= MF_NOCLEARMEM;
 
diff --git a/vgasrc/vgabios.h b/vgasrc/vgabios.h
index ff5ec45..5adbf4b 100644
--- a/vgasrc/vgabios.h
+++ b/vgasrc/vgabios.h
@@ -39,6 +39,7 @@ struct saveBDAstate {
 };
 
 // Mode flags
+#define MF_LEGACY     0x0001
 #define MF_GRAYSUM    0x0002
 #define MF_NOPALETTE  0x0008
 #define MF_CUSTOMCRTC 0x0800
-- 
1.7.1