diff options
author | Marc Aurele La France <root@ualberta.ca> | 2009-06-29 18:07:02 -0600 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-07-30 14:40:09 -0700 |
commit | fe9ec90d1c0248bd753c1b45e7e26aec71424657 (patch) | |
tree | d5d8a860107c0512e879bde84ad755384153d1c7 | |
parent | b556f93a508bfda0a25c8beb06f400ce813df59d (diff) | |
download | lwn-fe9ec90d1c0248bd753c1b45e7e26aec71424657.tar.gz lwn-fe9ec90d1c0248bd753c1b45e7e26aec71424657.zip |
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 <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>
-rw-r--r-- | arch/x86/boot/video-vga.c | 44 |
1 files changed, 31 insertions, 13 deletions
diff --git a/arch/x86/boot/video-vga.c b/arch/x86/boot/video-vga.c index 9e0587a37768..2fd19e6f3aaa 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 |