19682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* $XFree86: xc/lib/Xxf86dga/XF86DGA.c,v 3.19 2001/08/18 02:41:30 dawes Exp $ */
29682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/*
39682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
49682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCopyright (c) 1995  Jon Tombs
59682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCopyright (c) 1995,1996  The XFree86 Project, Inc
69682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
79682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall*/
89682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
99682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* THIS IS NOT AN X CONSORTIUM STANDARD */
109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#ifdef __EMX__ /* needed here to override certain constants in X headers */
129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define INCL_DOS
139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define INCL_DOSIOCTL
149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <os2.h>
159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif
169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#if defined(linux)
189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define HAS_MMAP_ANON
199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <sys/types.h>
209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <sys/mman.h>
219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/*#include <asm/page.h>*/   /* PAGE_SIZE */
229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define HAS_SC_PAGESIZE /* _SC_PAGESIZE may be an enum for Linux */
239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define HAS_GETPAGESIZE
249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif /* linux */
259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#if defined(CSRG_BASED)
279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define HAS_MMAP_ANON
289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define HAS_GETPAGESIZE
299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <sys/types.h>
309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <sys/mman.h>
319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif /* CSRG_BASED */
329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#if defined(DGUX)
349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define HAS_GETPAGESIZE
359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define MMAP_DEV_ZERO
369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <sys/types.h>
379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <sys/mman.h>
389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <unistd.h>
399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif /* DGUX */
409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#if defined(SVR4) && !defined(DGUX)
429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define MMAP_DEV_ZERO
439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <sys/types.h>
449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <sys/mman.h>
459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <unistd.h>
469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif /* SVR4 && !DGUX */
479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#if defined(sun) && !defined(SVR4) /* SunOS */
499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define MMAP_DEV_ZERO   /* doesn't SunOS have MAP_ANON ?? */
509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define HAS_GETPAGESIZE
519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <sys/types.h>
529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <sys/mman.h>
539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif /* sun && !SVR4 */
549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#ifdef XNO_SYSCONF
569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#undef _SC_PAGESIZE
579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif
589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define NEED_EVENTS
609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define NEED_REPLIES
619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* Apparently some X11 systems can't include this multiple times... */
639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#ifndef SDL_INCLUDED_XLIBINT_H
649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define SDL_INCLUDED_XLIBINT_H 1
659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <X11/Xlibint.h>
669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif
679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include "../extensions/xf86dga.h"
699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include "../extensions/xf86dgastr.h"
709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include "../extensions/Xext.h"
719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include "../extensions/extutil.h"
729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallextern XExtDisplayInfo* SDL_NAME(xdga_find_display)(Display*);
749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallextern char *SDL_NAME(xdga_extension_name);
759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define XF86DGACheckExtension(dpy,i,val) \
779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall  XextCheckExtension (dpy, i, SDL_NAME(xdga_extension_name), val)
789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/*****************************************************************************
809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *                                                                           *
819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *		    public XFree86-DGA Extension routines                    *
829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *                                                                           *
839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *****************************************************************************/
849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallBool SDL_NAME(XF86DGAQueryExtension) (
869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    Display *dpy,
879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int *event_basep,
889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int *error_basep
899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall){
909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return SDL_NAME(XDGAQueryExtension)(dpy, event_basep, error_basep);
919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall}
929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallBool SDL_NAME(XF86DGAQueryVersion)(
949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    Display* dpy,
959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int* majorVersion,
969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int* minorVersion
979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall){
989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return SDL_NAME(XDGAQueryVersion)(dpy, majorVersion, minorVersion);
999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall}
1009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallBool SDL_NAME(XF86DGAGetVideoLL)(
1029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    Display* dpy,
1039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int screen,
1049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int *offset,
1059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int *width,
1069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int *bank_size,
1079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int *ram_size
1089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall){
1099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
1109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    xXF86DGAGetVideoLLReply rep;
1119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    xXF86DGAGetVideoLLReq *req;
1129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    XF86DGACheckExtension (dpy, info, False);
1149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    LockDisplay(dpy);
1169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    GetReq(XF86DGAGetVideoLL, req);
1179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->reqType = info->codes->major_opcode;
1189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->dgaReqType = X_XF86DGAGetVideoLL;
1199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->screen = screen;
1209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
1219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	UnlockDisplay(dpy);
1229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	SyncHandle();
1239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return False;
1249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
1259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    *offset = /*(char *)*/rep.offset;
1279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    *width = rep.width;
1289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    *bank_size = rep.bank_size;
1299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    *ram_size = rep.ram_size;
1309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    UnlockDisplay(dpy);
1329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    SyncHandle();
1339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return True;
1349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall}
1359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallBool SDL_NAME(XF86DGADirectVideoLL)(
1389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    Display* dpy,
1399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int screen,
1409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int enable
1419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall){
1429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
1439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    xXF86DGADirectVideoReq *req;
1449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    XF86DGACheckExtension (dpy, info, False);
1469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    LockDisplay(dpy);
1489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    GetReq(XF86DGADirectVideo, req);
1499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->reqType = info->codes->major_opcode;
1509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->dgaReqType = X_XF86DGADirectVideo;
1519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->screen = screen;
1529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->enable = enable;
1539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    UnlockDisplay(dpy);
1549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    SyncHandle();
1559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    XSync(dpy,False);
1569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return True;
1579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall}
1589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallBool SDL_NAME(XF86DGAGetViewPortSize)(
1609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    Display* dpy,
1619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int screen,
1629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int *width,
1639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int *height
1649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall){
1659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
1669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    xXF86DGAGetViewPortSizeReply rep;
1679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    xXF86DGAGetViewPortSizeReq *req;
1689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    XF86DGACheckExtension (dpy, info, False);
1709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    LockDisplay(dpy);
1729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    GetReq(XF86DGAGetViewPortSize, req);
1739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->reqType = info->codes->major_opcode;
1749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->dgaReqType = X_XF86DGAGetViewPortSize;
1759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->screen = screen;
1769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
1779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	UnlockDisplay(dpy);
1789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	SyncHandle();
1799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return False;
1809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
1819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    *width = rep.width;
1839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    *height = rep.height;
1849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    UnlockDisplay(dpy);
1869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    SyncHandle();
1879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return True;
1889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall}
1899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallBool SDL_NAME(XF86DGASetViewPort)(
1929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    Display* dpy,
1939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int screen,
1949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int x,
1959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int y
1969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall){
1979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
1989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    xXF86DGASetViewPortReq *req;
1999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    XF86DGACheckExtension (dpy, info, False);
2019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    LockDisplay(dpy);
2039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    GetReq(XF86DGASetViewPort, req);
2049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->reqType = info->codes->major_opcode;
2059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->dgaReqType = X_XF86DGASetViewPort;
2069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->screen = screen;
2079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->x = x;
2089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->y = y;
2099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    UnlockDisplay(dpy);
2109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    SyncHandle();
2119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    XSync(dpy,False);
2129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return True;
2139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall}
2149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallBool SDL_NAME(XF86DGAGetVidPage)(
2179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    Display* dpy,
2189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int screen,
2199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int *vpage
2209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall){
2219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
2229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    xXF86DGAGetVidPageReply rep;
2239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    xXF86DGAGetVidPageReq *req;
2249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    XF86DGACheckExtension (dpy, info, False);
2269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    LockDisplay(dpy);
2289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    GetReq(XF86DGAGetVidPage, req);
2299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->reqType = info->codes->major_opcode;
2309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->dgaReqType = X_XF86DGAGetVidPage;
2319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->screen = screen;
2329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
2339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	UnlockDisplay(dpy);
2349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	SyncHandle();
2359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return False;
2369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
2379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    *vpage = rep.vpage;
2399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    UnlockDisplay(dpy);
2409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    SyncHandle();
2419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return True;
2429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall}
2439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallBool SDL_NAME(XF86DGASetVidPage)(
2469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    Display* dpy,
2479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int screen,
2489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int vpage
2499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall){
2509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
2519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    xXF86DGASetVidPageReq *req;
2529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    XF86DGACheckExtension (dpy, info, False);
2549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    LockDisplay(dpy);
2569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    GetReq(XF86DGASetVidPage, req);
2579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->reqType = info->codes->major_opcode;
2589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->dgaReqType = X_XF86DGASetVidPage;
2599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->screen = screen;
2609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->vpage = vpage;
2619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    UnlockDisplay(dpy);
2629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    SyncHandle();
2639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    XSync(dpy,False);
2649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return True;
2659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall}
2669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallBool SDL_NAME(XF86DGAInstallColormap)(
2689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    Display* dpy,
2699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int screen,
2709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    Colormap cmap
2719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall){
2729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
2739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    xXF86DGAInstallColormapReq *req;
2749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    XF86DGACheckExtension (dpy, info, False);
2769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    LockDisplay(dpy);
2789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    GetReq(XF86DGAInstallColormap, req);
2799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->reqType = info->codes->major_opcode;
2809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->dgaReqType = X_XF86DGAInstallColormap;
2819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->screen = screen;
2829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->id = cmap;
2839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    UnlockDisplay(dpy);
2849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    SyncHandle();
2859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    XSync(dpy,False);
2869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return True;
2879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall}
2889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallBool SDL_NAME(XF86DGAQueryDirectVideo)(
2909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    Display *dpy,
2919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int screen,
2929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int *flags
2939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall){
2949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
2959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    xXF86DGAQueryDirectVideoReply rep;
2969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    xXF86DGAQueryDirectVideoReq *req;
2979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    XF86DGACheckExtension (dpy, info, False);
2999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    LockDisplay(dpy);
3019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    GetReq(XF86DGAQueryDirectVideo, req);
3029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->reqType = info->codes->major_opcode;
3039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->dgaReqType = X_XF86DGAQueryDirectVideo;
3049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->screen = screen;
3059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
3069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	UnlockDisplay(dpy);
3079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	SyncHandle();
3089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return False;
3099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
3109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    *flags = rep.flags;
3119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    UnlockDisplay(dpy);
3129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    SyncHandle();
3139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return True;
3149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall}
3159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallBool SDL_NAME(XF86DGAViewPortChanged)(
3179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    Display *dpy,
3189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int screen,
3199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int n
3209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall){
3219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
3229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    xXF86DGAViewPortChangedReply rep;
3239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    xXF86DGAViewPortChangedReq *req;
3249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    XF86DGACheckExtension (dpy, info, False);
3269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    LockDisplay(dpy);
3289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    GetReq(XF86DGAViewPortChanged, req);
3299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->reqType = info->codes->major_opcode;
3309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->dgaReqType = X_XF86DGAViewPortChanged;
3319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->screen = screen;
3329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    req->n = n;
3339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
3349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	UnlockDisplay(dpy);
3359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	SyncHandle();
3369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return False;
3379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
3389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    UnlockDisplay(dpy);
3399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    SyncHandle();
3409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return rep.result;
3419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall}
3429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* Helper functions */
3469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <X11/Xmd.h>
3489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include "../extensions/xf86dga.h"
3499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <stdlib.h>
3509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <stdio.h>
3519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <fcntl.h>
3529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#if defined(ISC)
3539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# define HAS_SVR3_MMAP
3549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# include <sys/types.h>
3559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# include <errno.h>
3569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# include <sys/at_ansi.h>
3589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# include <sys/kd.h>
3599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# include <sys/sysmacros.h>
3619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# include <sys/immu.h>
3629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# include <sys/region.h>
3639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# include <sys/mmap.h>
3659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#else
3669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# if !defined(Lynx)
3679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#  if !defined(__EMX__)
3689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#   include <sys/mman.h>
3699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#  endif
3709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# else
3719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#  include <sys/types.h>
3729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#  include <errno.h>
3739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#  include <smem.h>
3749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# endif
3759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif
3769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <sys/wait.h>
3779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <signal.h>
3789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <unistd.h>
3799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#if defined(SVR4) && !defined(sun) && !defined(SCO325)
3819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define DEV_MEM "/dev/pmem"
3829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#elif defined(SVR4) && defined(sun)
3839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define DEV_MEM "/dev/xsvc"
3849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#else
3859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define DEV_MEM "/dev/mem"
3869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif
3879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Halltypedef struct {
3899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    unsigned long physaddr;	/* actual requested physical address */
3909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    unsigned long size;		/* actual requested map size */
3919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    unsigned long delta;	/* delta to account for page alignment */
3929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    void *	  vaddr;	/* mapped address, without the delta */
3939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int		  refcount;	/* reference count */
3949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} MapRec, *MapPtr;
3959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Halltypedef struct {
3979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    Display *	display;
3989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int		screen;
3999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    MapPtr	map;
4009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} ScrRec, *ScrPtr;
4019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallstatic int mapFd = -1;
4039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallstatic int numMaps = 0;
4049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallstatic int numScrs = 0;
4059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallstatic MapPtr *mapList = NULL;
4069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallstatic ScrPtr *scrList = NULL;
4079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallstatic MapPtr
4099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallAddMap(void)
4109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall{
4119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    MapPtr *old;
4129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    old = mapList;
4149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mapList = realloc(mapList, sizeof(MapPtr) * (numMaps + 1));
4159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if (!mapList) {
4169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	mapList = old;
4179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return NULL;
4189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
4199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mapList[numMaps] = malloc(sizeof(MapRec));
4209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if (!mapList[numMaps])
4219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return NULL;
4229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return mapList[numMaps++];
4239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall}
4249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallstatic ScrPtr
4269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallAddScr(void)
4279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall{
4289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ScrPtr *old;
4299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    old = scrList;
4319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    scrList = realloc(scrList, sizeof(ScrPtr) * (numScrs + 1));
4329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if (!scrList) {
4339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	scrList = old;
4349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return NULL;
4359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
4369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    scrList[numScrs] = malloc(sizeof(ScrRec));
4379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if (!scrList[numScrs])
4389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return NULL;
4399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return scrList[numScrs++];
4409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall}
4419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallstatic MapPtr
4439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallFindMap(unsigned long address, unsigned long size)
4449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall{
4459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int i;
4469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    for (i = 0; i < numMaps; i++) {
4489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if (mapList[i]->physaddr == address &&
4499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	    mapList[i]->size == size)
4509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	    return mapList[i];
4519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
4529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return NULL;
4539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall}
4549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallstatic ScrPtr
4569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallFindScr(Display *display, int screen)
4579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall{
4589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int i;
4599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    for (i = 0; i < numScrs; i++) {
4619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if (scrList[i]->display == display &&
4629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	    scrList[i]->screen == screen)
4639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	    return scrList[i];
4649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
4659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return NULL;
4669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall}
4679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallstatic void *
4699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallMapPhysAddress(unsigned long address, unsigned long size)
4709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall{
4719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    unsigned long offset, delta;
4729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int pagesize = -1;
4739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    void *vaddr;
4749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    MapPtr mp;
4759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#if defined(ISC) && defined(HAS_SVR3_MMAP)
4769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    struct kd_memloc mloc;
4779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#elif defined(__EMX__)
4789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    APIRET rc;
4799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ULONG action;
4809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    HFILE hfd;
4819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif
4829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if ((mp = FindMap(address, size))) {
4849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	mp->refcount++;
4859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return (void *)((unsigned long)mp->vaddr + mp->delta);
4869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
4879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#if defined(_SC_PAGESIZE) && defined(HAS_SC_PAGESIZE)
4899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    pagesize = sysconf(_SC_PAGESIZE);
4909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif
4919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#ifdef _SC_PAGE_SIZE
4929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if (pagesize == -1)
4939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	pagesize = sysconf(_SC_PAGE_SIZE);
4949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif
4959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#ifdef HAS_GETPAGESIZE
4969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if (pagesize == -1)
4979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	pagesize = getpagesize();
4989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif
4999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#ifdef PAGE_SIZE
5009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if (pagesize == -1)
5019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	pagesize = PAGE_SIZE;
5029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif
5039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if (pagesize == -1)
5049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	pagesize = 4096;
5059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall   delta = address % pagesize;
5079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall   offset = address - delta;
5089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#if defined(ISC) && defined(HAS_SVR3_MMAP)
5109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if (mapFd < 0) {
5119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if ((mapFd = open("/dev/mmap", O_RDWR)) < 0)
5129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	    return NULL;
5139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
5149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mloc.vaddr = (char *)0;
5159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mloc.physaddr = (char *)offset;
5169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mloc.length = size + delta;
5179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mloc.ioflg=1;
5189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if ((vaddr = (void *)ioctl(mapFd, MAP, &mloc)) == (void *)-1)
5209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return NULL;
5219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#elif defined (__EMX__)
5229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    /*
5239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall     * Dragon warning here! /dev/pmap$ is never closed, except on progam exit.
5249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall     * Consecutive calling of this routine will make PMAP$ driver run out
5259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall     * of memory handles. Some umap/close mechanism should be provided
5269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall     */
5279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    rc = DosOpen("/dev/pmap$", &hfd, &action, 0, FILE_NORMAL, FILE_OPEN,
5299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		 OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYNONE, (PEAOP2)NULL);
5309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if (rc != 0)
5319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return NULL;
5329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
5339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	struct map_ioctl {
5349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		union {
5359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			ULONG phys;
5369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			void* user;
5379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		} a;
5389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		ULONG size;
5399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	} pmap,dmap;
5409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	ULONG plen,dlen;
5419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define XFREE86_PMAP	0x76
5429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define PMAP_MAP	0x44
5439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	pmap.a.phys = offset;
5459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	pmap.size = size + delta;
5469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	rc = DosDevIOCtl(hfd, XFREE86_PMAP, PMAP_MAP,
5479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			 (PULONG)&pmap, sizeof(pmap), &plen,
5489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			 (PULONG)&dmap, sizeof(dmap), &dlen);
5499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if (rc == 0) {
5509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		vaddr = dmap.a.user;
5519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
5529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall   }
5539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall   if (rc != 0)
5549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return NULL;
5559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#elif defined (Lynx)
5569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    vaddr = (void *)smem_create("XF86DGA", (char *)offset,
5579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall				size + delta, SM_READ|SM_WRITE);
5589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#else
5599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#ifndef MAP_FILE
5609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define MAP_FILE 0
5619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif
5629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if (mapFd < 0) {
5639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if ((mapFd = open(DEV_MEM, O_RDWR)) < 0)
5649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	    return NULL;
5659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
5669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    vaddr = (void *)mmap(NULL, size + delta, PROT_READ | PROT_WRITE,
5679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                        MAP_FILE | MAP_SHARED, mapFd, (off_t)offset);
5689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if (vaddr == (void *)-1)
5699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return NULL;
5709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif
5719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if (!vaddr) {
5739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if (!(mp = AddMap()))
5749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	    return NULL;
5759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	mp->physaddr = address;
5769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	mp->size = size;
5779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	mp->delta = delta;
5789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	mp->vaddr = vaddr;
5799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	mp->refcount = 1;
5809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
5819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return (void *)((unsigned long)vaddr + delta);
5829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall}
5839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/*
5859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * Still need to find a clean way of detecting the death of a DGA app
5869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * and returning things to normal - Jon
5879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * This is here to help debugging without rebooting... Also C-A-BS
5889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * should restore text mode.
5899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall */
5909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallint
5929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallSDL_NAME(XF86DGAForkApp)(int screen)
5939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall{
5949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    pid_t pid;
5959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int status;
5969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int i;
5979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall     /* fork the app, parent hangs around to clean up */
5999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if ((pid = fork()) > 0) {
6009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	ScrPtr sp;
6019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	waitpid(pid, &status, 0);
6039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	for (i = 0; i < numScrs; i++) {
6049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	    sp = scrList[i];
6059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	    SDL_NAME(XF86DGADirectVideoLL)(sp->display, sp->screen, 0);
6069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	    XSync(sp->display, False);
6079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
608e4c5d95ed37611acc6a186522315195b4ebfb9efJesse Hall    if (WIFEXITED(status))
609e4c5d95ed37611acc6a186522315195b4ebfb9efJesse Hall	    exit(0);
6109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	else
611e4c5d95ed37611acc6a186522315195b4ebfb9efJesse Hall	    exit(-1);
6129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
6139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return pid;
6149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall}
6159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallBool
6189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallSDL_NAME(XF86DGADirectVideo)(
6199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    Display *dis,
6209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int screen,
6219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int enable
6229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall){
6239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ScrPtr sp;
6249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    MapPtr mp = NULL;
6259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if ((sp = FindScr(dis, screen)))
6279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	mp = sp->map;
6289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if (enable & XF86DGADirectGraphics) {
6309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#if !defined(ISC) && !defined(HAS_SVR3_MMAP) && !defined(Lynx) \
6319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	&& !defined(__EMX__)
6329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if (mp && mp->vaddr)
6339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	    mprotect(mp->vaddr, mp->size + mp->delta, PROT_READ | PROT_WRITE);
6349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif
6359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    } else {
6369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#if !defined(ISC) && !defined(HAS_SVR3_MMAP) && !defined(Lynx) \
6379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	&& !defined(__EMX__)
6389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if (mp && mp->vaddr)
6399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	    mprotect(mp->vaddr, mp->size + mp->delta, PROT_READ);
6409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#elif defined(Lynx)
6419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	/* XXX this doesn't allow enable after disable */
6429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	smem_create(NULL, mp->vaddr, mp->size + mp->delta, SM_DETACH);
6439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	smem_remove("XF86DGA");
6449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif
6459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
6469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    SDL_NAME(XF86DGADirectVideoLL)(dis, screen, enable);
6489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return 1;
6499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall}
6509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallstatic void
6539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallXF86cleanup(int sig)
6549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall{
6559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ScrPtr sp;
6569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int i;
6579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    static char beenhere = 0;
6589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if (beenhere)
660e4c5d95ed37611acc6a186522315195b4ebfb9efJesse Hall	    exit(3);
6619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    beenhere = 1;
6629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    for (i = 0; i < numScrs; i++) {
6649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	sp = scrList[i];
6659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	SDL_NAME(XF86DGADirectVideo)(sp->display, sp->screen, 0);
6669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	XSync(sp->display, False);
6679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
668e4c5d95ed37611acc6a186522315195b4ebfb9efJesse Hall    exit(3);
6699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall}
6709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallBool
6729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallSDL_NAME(XF86DGAGetVideo)(
6739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    Display *dis,
6749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int screen,
6759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    char **addr,
6769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int *width,
6779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int *bank,
6789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int *ram
6799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall){
6809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    /*unsigned long*/ int offset;
6819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    static int beenHere = 0;
6829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ScrPtr sp;
6839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    MapPtr mp;
6849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if (!(sp = FindScr(dis, screen))) {
6869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if (!(sp = AddScr())) {
6879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	    fprintf(stderr, "XF86DGAGetVideo: malloc failure\n");
6889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	    exit(-2);
6899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
6909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	sp->display = dis;
6919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	sp->screen = screen;
6929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	sp->map = NULL;
6939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
6949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    SDL_NAME(XF86DGAGetVideoLL)(dis, screen , &offset, width, bank, ram);
6969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    *addr = MapPhysAddress(offset, *bank);
6989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if (*addr == NULL) {
6999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	fprintf(stderr, "XF86DGAGetVideo: failed to map video memory (%s)\n",
7009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		strerror(errno));
7019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	exit(-2);
7029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
7039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if ((mp = FindMap(offset, *bank)))
7059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	sp->map = mp;
7069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if (!beenHere) {
7089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	beenHere = 1;
7099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	atexit((void(*)(void))XF86cleanup);
7109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	/* one shot XF86cleanup attempts */
7119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	signal(SIGSEGV, XF86cleanup);
7129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#ifdef SIGBUS
7139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	signal(SIGBUS, XF86cleanup);
7149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif
7159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	signal(SIGHUP, XF86cleanup);
7169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	signal(SIGFPE, XF86cleanup);
7179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
7189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return 1;
7209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall}
7219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
722