mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-15 10:17:20 +00:00
workaround painful vm86_datacall requirement that segment+offset
must be withing the same PAGE frame
This commit is contained in:
parent
1c4d62951a
commit
bb2691312e
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=39744
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user