mirror of
https://github.com/torvalds/linux
synced 2024-09-06 18:01:05 +00:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/hpa/linux-2.6-x86setup
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/hpa/linux-2.6-x86setup: [x86 setup] Don't rely on the VESA BIOS being register-clean
This commit is contained in:
commit
2f81eccbd7
|
@ -29,7 +29,7 @@ static void vesa_store_mode_params_graphics(void);
|
|||
static int vesa_probe(void)
|
||||
{
|
||||
#if defined(CONFIG_VIDEO_VESA) || defined(CONFIG_FIRMWARE_EDID)
|
||||
u16 ax;
|
||||
u16 ax, cx, di;
|
||||
u16 mode;
|
||||
addr_t mode_ptr;
|
||||
struct mode_info *mi;
|
||||
|
@ -39,9 +39,11 @@ static int vesa_probe(void)
|
|||
|
||||
vginfo.signature = VBE2_MAGIC;
|
||||
|
||||
/* Optimistically assume a VESA BIOS is register-clean... */
|
||||
ax = 0x4f00;
|
||||
asm("int $0x10" : "+a" (ax), "=m" (vginfo) : "D" (&vginfo));
|
||||
di = (size_t)&vginfo;
|
||||
asm(INT10
|
||||
: "+a" (ax), "+D" (di), "=m" (vginfo)
|
||||
: : "ebx", "ecx", "edx", "esi");
|
||||
|
||||
if (ax != 0x004f ||
|
||||
vginfo.signature != VESA_MAGIC ||
|
||||
|
@ -64,9 +66,11 @@ static int vesa_probe(void)
|
|||
memset(&vminfo, 0, sizeof vminfo); /* Just in case... */
|
||||
|
||||
ax = 0x4f01;
|
||||
asm("int $0x10"
|
||||
: "+a" (ax), "=m" (vminfo)
|
||||
: "c" (mode), "D" (&vminfo));
|
||||
cx = mode;
|
||||
di = (size_t)&vminfo;
|
||||
asm(INT10
|
||||
: "+a" (ax), "+c" (cx), "+D" (di), "=m" (vminfo)
|
||||
: : "ebx", "edx", "esi");
|
||||
|
||||
if (ax != 0x004f)
|
||||
continue;
|
||||
|
@ -102,16 +106,18 @@ static int vesa_probe(void)
|
|||
|
||||
static int vesa_set_mode(struct mode_info *mode)
|
||||
{
|
||||
u16 ax;
|
||||
u16 ax, bx, cx, di;
|
||||
int is_graphic;
|
||||
u16 vesa_mode = mode->mode - VIDEO_FIRST_VESA;
|
||||
|
||||
memset(&vminfo, 0, sizeof vminfo); /* Just in case... */
|
||||
|
||||
ax = 0x4f01;
|
||||
asm("int $0x10"
|
||||
: "+a" (ax), "=m" (vminfo)
|
||||
: "c" (vesa_mode), "D" (&vminfo));
|
||||
cx = vesa_mode;
|
||||
di = (size_t)&vminfo;
|
||||
asm(INT10
|
||||
: "+a" (ax), "+c" (cx), "+D" (di), "=m" (vminfo)
|
||||
: : "ebx", "edx", "esi");
|
||||
|
||||
if (ax != 0x004f)
|
||||
return -1;
|
||||
|
@ -129,9 +135,11 @@ static int vesa_set_mode(struct mode_info *mode)
|
|||
|
||||
|
||||
ax = 0x4f02;
|
||||
asm volatile("int $0x10"
|
||||
: "+a" (ax)
|
||||
: "b" (vesa_mode), "D" (0));
|
||||
bx = vesa_mode;
|
||||
di = 0;
|
||||
asm volatile(INT10
|
||||
: "+a" (ax), "+b" (bx), "+D" (di)
|
||||
: : "ecx", "edx", "esi");
|
||||
|
||||
if (ax != 0x004f)
|
||||
return -1;
|
||||
|
|
Loading…
Reference in a new issue