diff options
-rw-r--r-- | arch/i386/boot/video-vesa.c | 34 |
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); | |||
29 | static int vesa_probe(void) | 29 | static 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 | ||
103 | static int vesa_set_mode(struct mode_info *mode) | 107 | static 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; |