From: Marc Aurele La France Date: Tue, 30 Jun 2009 00:07:02 +0000 (-0600) Subject: x86, setup (2.6.30-stable) fix 80x34 and 80x60 console modes X-Git-Tag: v2.6.30.4~23 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fe9ec90d1c0248bd753c1b45e7e26aec71424657;p=thirdparty%2Fkernel%2Fstable.git x86, setup (2.6.30-stable) fix 80x34 and 80x60 console modes Note: this is not in upstream since upstream is not affected due to the new "BIOS glovebox" subsystem. As coded, most INT10 calls in video-vga.c allow the compiler to assume EAX remains unchanged across them, which is not always the case. This triggers an optimisation issue that causes vga_set_vertical_end() to be called with an incorrect number of scanlines. Fix this by beefing up the asm constraints on these calls. Reported-by: Marc Aurele La France Signed-off-by: Marc Aurele La France Acked-by: H. Peter Anvin Signed-off-by: Greg Kroah-Hartman --- diff --git a/arch/x86/boot/video-vga.c b/arch/x86/boot/video-vga.c index 9e0587a377686..2fd19e6f3aaa2 100644 --- a/arch/x86/boot/video-vga.c +++ b/arch/x86/boot/video-vga.c @@ -45,8 +45,10 @@ static u8 vga_set_basic_mode(void) #ifdef CONFIG_VIDEO_400_HACK if (adapter >= ADAPTER_VGA) { + ax = 0x1202; asm volatile(INT10 - : : "a" (0x1202), "b" (0x0030) + : "+a" (ax) + : "b" (0x0030) : "ecx", "edx", "esi", "edi"); } #endif @@ -81,44 +83,59 @@ static u8 vga_set_basic_mode(void) static void vga_set_8font(void) { + u16 ax; + /* Set 8x8 font - 80x43 on EGA, 80x50 on VGA */ /* Set 8x8 font */ - asm volatile(INT10 : : "a" (0x1112), "b" (0)); + ax = 0x1112; + asm volatile(INT10 : "+a" (ax) : "b" (0)); /* Use alternate print screen */ - asm volatile(INT10 : : "a" (0x1200), "b" (0x20)); + ax = 0x1200; + asm volatile(INT10 : "+a" (ax) : "b" (0x20)); /* Turn off cursor emulation */ - asm volatile(INT10 : : "a" (0x1201), "b" (0x34)); + ax = 0x1201; + asm volatile(INT10 : "+a" (ax) : "b" (0x34)); /* Cursor is scan lines 6-7 */ - asm volatile(INT10 : : "a" (0x0100), "c" (0x0607)); + ax = 0x0100; + asm volatile(INT10 : "+a" (ax) : "c" (0x0607)); } static void vga_set_14font(void) { + u16 ax; + /* Set 9x14 font - 80x28 on VGA */ /* Set 9x14 font */ - asm volatile(INT10 : : "a" (0x1111), "b" (0)); + ax = 0x1111; + asm volatile(INT10 : "+a" (ax) : "b" (0)); /* Turn off cursor emulation */ - asm volatile(INT10 : : "a" (0x1201), "b" (0x34)); + ax = 0x1201; + asm volatile(INT10 : "+a" (ax) : "b" (0x34)); /* Cursor is scan lines 11-12 */ - asm volatile(INT10 : : "a" (0x0100), "c" (0x0b0c)); + ax = 0x0100; + asm volatile(INT10 : "+a" (ax) : "c" (0x0b0c)); } static void vga_set_80x43(void) { + u16 ax; + /* Set 80x43 mode on VGA (not EGA) */ /* Set 350 scans */ - asm volatile(INT10 : : "a" (0x1201), "b" (0x30)); + ax = 0x1201; + asm volatile(INT10 : "+a" (ax) : "b" (0x30)); /* Reset video mode */ - asm volatile(INT10 : : "a" (0x0003)); + ax = 0x0003; + asm volatile(INT10 : "+a" (ax)); vga_set_8font(); } @@ -225,7 +242,7 @@ static int vga_set_mode(struct mode_info *mode) */ static int vga_probe(void) { - u16 ega_bx; + u16 ax, ega_bx; static const char *card_name[] = { "CGA/MDA/HGC", "EGA", "VGA" @@ -242,9 +259,10 @@ static int vga_probe(void) }; u8 vga_flag; + ax = 0x1200; asm(INT10 - : "=b" (ega_bx) - : "a" (0x1200), "b" (0x10) /* Check EGA/VGA */ + : "+a" (ax), "=b" (ega_bx) + : "b" (0x10) /* Check EGA/VGA */ : "ecx", "edx", "esi", "edi"); #ifndef _WAKEUP