x86, setup: Don't skip mode setting for the standard VGA modes
The code for setting standard VGA modes probes for the current mode, and skips the mode setting if the mode is 3 (color text 80x25) or 7 (mono text 80x25). Unfortunately, there are BIOSes, including the VMware BIOS, which report the previous mode if function 0F is queried while the screen is in a VESA mode, and of course, nothing can help a mode poked directly into the hardware. As such, the safe option is to set the mode anyway, and only query to see if we should be using mode 7 rather than mode 3. People who don't want any mode setting at all should probably use vga=0x0f04 (VIDEO_CURRENT_MODE). It's possible that should be the kernel default. Reported-by Rene Arends <R.R.Arends@hro.nl> Signed-off-by: H. Peter Anvin <hpa@zytor.com> LKML-Reference: <tip-*@git.kernel.org>
This commit is contained in:
Родитель
eb572a5c79
Коммит
8e92dc767a
|
@ -42,22 +42,15 @@ static u8 vga_set_basic_mode(void)
|
||||||
{
|
{
|
||||||
struct biosregs ireg, oreg;
|
struct biosregs ireg, oreg;
|
||||||
u16 ax;
|
u16 ax;
|
||||||
u8 rows;
|
|
||||||
u8 mode;
|
u8 mode;
|
||||||
|
|
||||||
initregs(&ireg);
|
initregs(&ireg);
|
||||||
|
|
||||||
|
/* Query current mode */
|
||||||
ax = 0x0f00;
|
ax = 0x0f00;
|
||||||
intcall(0x10, &ireg, &oreg);
|
intcall(0x10, &ireg, &oreg);
|
||||||
mode = oreg.al;
|
mode = oreg.al;
|
||||||
|
|
||||||
set_fs(0);
|
|
||||||
rows = rdfs8(0x484); /* rows minus one */
|
|
||||||
|
|
||||||
if ((oreg.ax == 0x5003 || oreg.ax == 0x5007) &&
|
|
||||||
(rows == 0 || rows == 24))
|
|
||||||
return mode;
|
|
||||||
|
|
||||||
if (mode != 3 && mode != 7)
|
if (mode != 3 && mode != 7)
|
||||||
mode = 3;
|
mode = 3;
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче