diff options
-rw-r--r-- | sys/dev/fb/vesa.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/sys/dev/fb/vesa.c b/sys/dev/fb/vesa.c index 5fa4eb4..68f184b 100644 --- a/sys/dev/fb/vesa.c +++ b/sys/dev/fb/vesa.c @@ -799,19 +799,25 @@ vesa_bios_init(void) /* * Shadow video ROM. */ - offs = BIOS_SADDRTOLADDR(vesa_bios_int10); + offs = vesa_bios_int10; if (vesa_shadow_rom) { vbios = x86bios_get_orm(vesa_bios_offs); if (vbios != NULL) { vesa_bios_size = vbios[2] * 512; - vesa_bios = x86bios_alloc(&vesa_bios_offs, - vesa_bios_size, M_WAITOK); - memcpy(vesa_bios, vbios, vesa_bios_size); - offs = offs - VESA_BIOS_OFFSET + vesa_bios_offs; - offs = (X86BIOS_PHYSTOSEG(offs) << 16) + - X86BIOS_PHYSTOOFF(offs); - x86bios_set_intr(0x10, offs); - } else + offs = BIOS_SADDRTOLADDR(vesa_bios_int10); + if (offs > vesa_bios_offs && + offs < vesa_bios_offs + vesa_bios_size) { + vesa_bios = x86bios_alloc(&vesa_bios_offs, + vesa_bios_size, M_WAITOK); + memcpy(vesa_bios, vbios, vesa_bios_size); + offs = offs - VESA_BIOS_OFFSET + vesa_bios_offs; + offs = (X86BIOS_PHYSTOSEG(offs) << 16) + + X86BIOS_PHYSTOOFF(offs); + x86bios_set_intr(0x10, offs); + } else + offs = vesa_bios_int10; + } + if (vesa_bios == NULL) printf("VESA: failed to shadow video ROM\n"); } if (bootverbose) |