aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@woody.linux-foundation.org>2007-08-31 23:41:03 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-08-31 23:41:03 -0400
commit2f81eccbd7a5440b43ff874c8f02d6143f41ba4f (patch)
treeb08e2e80f8626efe0444c17adbaf3729a5469697
parent6db602d447fb6c3aeb020c5dff5219de317f8bb4 (diff)
parent4221d014ea04d439e6d1e65951c3b406e7c1b7ab (diff)
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
-rw-r--r--arch/i386/boot/video-vesa.c34
1 files changed, 21 insertions, 13 deletions
diff --git a/arch/i386/boot/video-vesa.c b/arch/i386/boot/video-vesa.c
index f1bc71e948cf..192190710710 100644
--- a/arch/i386/boot/video-vesa.c
+++ b/arch/i386/boot/video-vesa.c
@@ -29,7 +29,7 @@ static void vesa_store_mode_params_graphics(void);
29static int vesa_probe(void) 29static int vesa_probe(void)
30{ 30{
31#if defined(CONFIG_VIDEO_VESA) || defined(CONFIG_FIRMWARE_EDID) 31#if defined(CONFIG_VIDEO_VESA) || defined(CONFIG_FIRMWARE_EDID)
32 u16 ax; 32 u16 ax, cx, di;
33 u16 mode; 33 u16 mode;
34 addr_t mode_ptr; 34 addr_t mode_ptr;
35 struct mode_info *mi; 35 struct mode_info *mi;
@@ -39,9 +39,11 @@ static int vesa_probe(void)
39 39
40 vginfo.signature = VBE2_MAGIC; 40 vginfo.signature = VBE2_MAGIC;
41 41
42 /* Optimistically assume a VESA BIOS is register-clean... */
43 ax = 0x4f00; 42 ax = 0x4f00;
44 asm("int $0x10" : "+a" (ax), "=m" (vginfo) : "D" (&vginfo)); 43 di = (size_t)&vginfo;
44 asm(INT10
45 : "+a" (ax), "+D" (di), "=m" (vginfo)
46 : : "ebx", "ecx", "edx", "esi");
45 47
46 if (ax != 0x004f || 48 if (ax != 0x004f ||
47 vginfo.signature != VESA_MAGIC || 49 vginfo.signature != VESA_MAGIC ||
@@ -64,9 +66,11 @@ static int vesa_probe(void)
64 memset(&vminfo, 0, sizeof vminfo); /* Just in case... */ 66 memset(&vminfo, 0, sizeof vminfo); /* Just in case... */
65 67
66 ax = 0x4f01; 68 ax = 0x4f01;
67 asm("int $0x10" 69 cx = mode;
68 : "+a" (ax), "=m" (vminfo) 70 di = (size_t)&vminfo;
69 : "c" (mode), "D" (&vminfo)); 71 asm(INT10
72 : "+a" (ax), "+c" (cx), "+D" (di), "=m" (vminfo)
73 : : "ebx", "edx", "esi");
70 74
71 if (ax != 0x004f) 75 if (ax != 0x004f)
72 continue; 76 continue;
@@ -102,16 +106,18 @@ static int vesa_probe(void)
102 106
103static int vesa_set_mode(struct mode_info *mode) 107static int vesa_set_mode(struct mode_info *mode)
104{ 108{
105 u16 ax; 109 u16 ax, bx, cx, di;
106 int is_graphic; 110 int is_graphic;
107 u16 vesa_mode = mode->mode - VIDEO_FIRST_VESA; 111 u16 vesa_mode = mode->mode - VIDEO_FIRST_VESA;
108 112
109 memset(&vminfo, 0, sizeof vminfo); /* Just in case... */ 113 memset(&vminfo, 0, sizeof vminfo); /* Just in case... */
110 114
111 ax = 0x4f01; 115 ax = 0x4f01;
112 asm("int $0x10" 116 cx = vesa_mode;
113 : "+a" (ax), "=m" (vminfo) 117 di = (size_t)&vminfo;
114 : "c" (vesa_mode), "D" (&vminfo)); 118 asm(INT10
119 : "+a" (ax), "+c" (cx), "+D" (di), "=m" (vminfo)
120 : : "ebx", "edx", "esi");
115 121
116 if (ax != 0x004f) 122 if (ax != 0x004f)
117 return -1; 123 return -1;
@@ -129,9 +135,11 @@ static int vesa_set_mode(struct mode_info *mode)
129 135
130 136
131 ax = 0x4f02; 137 ax = 0x4f02;
132 asm volatile("int $0x10" 138 bx = vesa_mode;
133 : "+a" (ax) 139 di = 0;
134 : "b" (vesa_mode), "D" (0)); 140 asm volatile(INT10
141 : "+a" (ax), "+b" (bx), "+D" (di)
142 : : "ecx", "edx", "esi");
135 143
136 if (ax != 0x004f) 144 if (ax != 0x004f)
137 return -1; 145 return -1;