x86, setup: "glove box" BIOS interrupts in the video code
Impact: BIOS proofing "Glove box" off BIOS interrupts in the video code. LKML-Reference: <49DE7F79.4030106@zytor.com> Signed-off-by: H. Peter Anvin <hpa@linux.intel.com> Cc: Pavel Machek <pavel@ucw.cz> Cc: Rafael J. Wysocki <rjw@sisk.pl>
Цей коміт міститься в:

зафіксовано
H. Peter Anvin

джерело
0a706db320
коміт
cf06de7b9c
@@ -2,6 +2,7 @@
|
||||
*
|
||||
* Copyright (C) 1991, 1992 Linus Torvalds
|
||||
* Copyright 2007 rPath, Inc. - All Rights Reserved
|
||||
* Copyright 2009 Intel Corporation; author H. Peter Anvin
|
||||
*
|
||||
* This file is part of the Linux kernel, and is made available under
|
||||
* the terms of the GNU General Public License version 2.
|
||||
@@ -29,21 +30,21 @@ static int bios_set_mode(struct mode_info *mi)
|
||||
|
||||
static int set_bios_mode(u8 mode)
|
||||
{
|
||||
u16 ax;
|
||||
struct biosregs ireg, oreg;
|
||||
u8 new_mode;
|
||||
|
||||
ax = mode; /* AH=0x00 Set Video Mode */
|
||||
asm volatile(INT10
|
||||
: "+a" (ax)
|
||||
: : "ebx", "ecx", "edx", "esi", "edi");
|
||||
initregs(&ireg);
|
||||
ireg.al = mode; /* AH=0x00 Set Video Mode */
|
||||
intcall(0x10, &ireg, NULL);
|
||||
|
||||
ax = 0x0f00; /* Get Current Video Mode */
|
||||
asm volatile(INT10
|
||||
: "+a" (ax)
|
||||
: : "ebx", "ecx", "edx", "esi", "edi");
|
||||
|
||||
ireg.ah = 0x0f; /* Get Current Video Mode */
|
||||
intcall(0x10, &ireg, &oreg);
|
||||
|
||||
do_restore = 1; /* Assume video contents were lost */
|
||||
new_mode = ax & 0x7f; /* Not all BIOSes are clean with the top bit */
|
||||
|
||||
/* Not all BIOSes are clean with the top bit */
|
||||
new_mode = ireg.al & 0x7f;
|
||||
|
||||
if (new_mode == mode)
|
||||
return 0; /* Mode change OK */
|
||||
@@ -53,10 +54,8 @@ static int set_bios_mode(u8 mode)
|
||||
/* Mode setting failed, but we didn't end up where we
|
||||
started. That's bad. Try to revert to the original
|
||||
video mode. */
|
||||
ax = boot_params.screen_info.orig_video_mode;
|
||||
asm volatile(INT10
|
||||
: "+a" (ax)
|
||||
: : "ebx", "ecx", "edx", "esi", "edi");
|
||||
ireg.ax = boot_params.screen_info.orig_video_mode;
|
||||
intcall(0x10, &ireg, NULL);
|
||||
}
|
||||
#endif
|
||||
return -1;
|
||||
|
Посилання в новій задачі
Заблокувати користувача