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 --- 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 d02b880..8eb226a 100644 --- a/vgasrc/clext.c +++ b/vgasrc/clext.c @@ -443,14 +443,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); } @@ -469,7 +469,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 6abe639..987a259 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