x86: fix usage of bios intcall()
authorAkinobu Mita <akinobu.mita@gmail.com>
Wed, 1 Jul 2009 02:13:07 +0000 (11:13 +0900)
committerH. Peter Anvin <hpa@zytor.com>
Sat, 4 Jul 2009 19:56:32 +0000 (12:56 -0700)
Some intcall() misuses the input biosregs as output in
cf06de7b9cdd3efee7a59dced1977b3c21d43732

This fixes the problem vga=ask boot option doesn't show enough modes.

Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
LKML-Reference: <20090701021307.GA3127@localhost.localdomain>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
arch/x86/boot/video-bios.c
arch/x86/boot/video-vesa.c

index d660be4..49e0c18 100644 (file)
@@ -37,14 +37,13 @@ static int set_bios_mode(u8 mode)
        ireg.al = mode;         /* AH=0x00 Set Video Mode */
        intcall(0x10, &ireg, NULL);
 
-
        ireg.ah = 0x0f;         /* Get Current Video Mode */
        intcall(0x10, &ireg, &oreg);
 
        do_restore = 1;         /* Assume video contents were lost */
 
        /* Not all BIOSes are clean with the top bit */
-       new_mode = ireg.al & 0x7f;
+       new_mode = oreg.al & 0x7f;
 
        if (new_mode == mode)
                return 0;       /* Mode change OK */
index c700147..275dd17 100644 (file)
@@ -45,7 +45,7 @@ static int vesa_probe(void)
        ireg.di = (size_t)&vginfo;
        intcall(0x10, &ireg, &oreg);
 
-       if (ireg.ax != 0x004f ||
+       if (oreg.ax != 0x004f ||
            vginfo.signature != VESA_MAGIC ||
            vginfo.version < 0x0102)
                return 0;       /* Not present */
@@ -70,7 +70,7 @@ static int vesa_probe(void)
                ireg.di = (size_t)&vminfo;
                intcall(0x10, &ireg, &oreg);
 
-               if (ireg.ax != 0x004f)
+               if (oreg.ax != 0x004f)
                        continue;
 
                if ((vminfo.mode_attr & 0x15) == 0x05) {