]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
x86, setup (2.6.30-stable) fix 80x34 and 80x60 console modes
authorMarc Aurele La France <root@ualberta.ca>
Tue, 30 Jun 2009 00:07:02 +0000 (18:07 -0600)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 30 Jul 2009 21:40:09 +0000 (14:40 -0700)
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 <tsi@xfree86.org>
Signed-off-by: Marc Aurele La France <tsi@xfree86.org>
Acked-by: H. Peter Anvin <hpa@zytor.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
arch/x86/boot/video-vga.c

index 9e0587a3776868e73b62b7def725997b6ffb7699..2fd19e6f3aaa232d4308fe1d31dad742d595b422 100644 (file)
@@ -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