diff options
| author | Andrey A. Chernov <ache@FreeBSD.org> | 1998-09-29 04:09:39 +0000 |
|---|---|---|
| committer | Andrey A. Chernov <ache@FreeBSD.org> | 1998-09-29 04:09:39 +0000 |
| commit | bb2691312e8fad83a8d8d0c47dffd8ee9b7f53bf (patch) | |
| tree | 96214752221b7f732464f32b60d7efc58c29c6bb | |
| parent | 1c4d62951a7538f7268ced8d30dbf0f375d2b94c (diff) | |
Notes
| -rw-r--r-- | sys/i386/isa/vesa.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/sys/i386/isa/vesa.c b/sys/i386/isa/vesa.c index fbd83a78122b..e03c71462a84 100644 --- a/sys/i386/isa/vesa.c +++ b/sys/i386/isa/vesa.c @@ -23,7 +23,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: vesa.c,v 1.2 1998/09/23 09:59:00 yokota Exp $ + * $Id: vesa.c,v 1.3 1998/09/25 11:55:46 yokota Exp $ */ #include "sc.h" @@ -327,10 +327,13 @@ vesa_translate_flags(u_int16_t vflags) static int vesa_bios_init(void) { - static u_char buf[512]; +#define VESA_INFO_SIZE 512 + static u_char buffer[VESA_INFO_SIZE * 2]; + static u_char *buf = buffer; struct vm86frame vmf; struct vesa_mode vmode; u_int32_t p; + u_short offset; int modes; int err; int i; @@ -343,10 +346,16 @@ vesa_bios_init(void) vesa_vmode[0].vi_mode = EOT; bzero(&vmf, sizeof(vmf)); /* paranoia */ - bzero(buf, sizeof(buf)); - bcopy("VBE2", buf, 4); /* try for VBE2 data */ + bzero(buffer, sizeof(buffer)); vmf.vmf_eax = 0x4f00; - err = vm86_datacall(0x10, &vmf, (char *)buf, sizeof(buf), + + /* workaround - see vm86.c:vm86_datacall */ + offset = (u_int)buf & PAGE_MASK; + if ((offset + VESA_INFO_SIZE) & PG_FRAME) + buf += PAGE_SIZE - offset; + + bcopy("VBE2", buf, 4); /* try for VBE2 data */ + err = vm86_datacall(0x10, &vmf, (char *)buf, VESA_INFO_SIZE, &vmf.vmf_es, &vmf.vmf_di); if ((err != 0) || (vmf.vmf_eax != 0x4f) || bcmp("VESA", buf, 4)) return 1; |
