Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86: fix usage of bios intcall()

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>

authored by

Akinobu Mita and committed by
H. Peter Anvin
febe04de 22a26e66

+3 -4
+1 -2
arch/x86/boot/video-bios.c
··· 37 37 ireg.al = mode; /* AH=0x00 Set Video Mode */ 38 38 intcall(0x10, &ireg, NULL); 39 39 40 - 41 40 ireg.ah = 0x0f; /* Get Current Video Mode */ 42 41 intcall(0x10, &ireg, &oreg); 43 42 44 43 do_restore = 1; /* Assume video contents were lost */ 45 44 46 45 /* Not all BIOSes are clean with the top bit */ 47 - new_mode = ireg.al & 0x7f; 46 + new_mode = oreg.al & 0x7f; 48 47 49 48 if (new_mode == mode) 50 49 return 0; /* Mode change OK */
+2 -2
arch/x86/boot/video-vesa.c
··· 45 45 ireg.di = (size_t)&vginfo; 46 46 intcall(0x10, &ireg, &oreg); 47 47 48 - if (ireg.ax != 0x004f || 48 + if (oreg.ax != 0x004f || 49 49 vginfo.signature != VESA_MAGIC || 50 50 vginfo.version < 0x0102) 51 51 return 0; /* Not present */ ··· 70 70 ireg.di = (size_t)&vminfo; 71 71 intcall(0x10, &ireg, &oreg); 72 72 73 - if (ireg.ax != 0x004f) 73 + if (oreg.ax != 0x004f) 74 74 continue; 75 75 76 76 if ((vminfo.mode_attr & 0x15) == 0x05) {