Bool SDL_NAME(XF86DGADirectVideo)( Display *dis, int screen, int enable ){ ScrPtr sp; MapPtr mp = NULL; if ((sp = FindScr(dis, screen))) mp = sp->map; if (enable & XF86DGADirectGraphics) { #if !defined(ISC) && !defined(HAS_SVR3_MMAP) && !defined(Lynx) \ && !defined(__EMX__) if (mp && mp->vaddr) mprotect(mp->vaddr, mp->size + mp->delta, PROT_READ | PROT_WRITE); #endif } else { #if !defined(ISC) && !defined(HAS_SVR3_MMAP) && !defined(Lynx) \ && !defined(__EMX__) if (mp && mp->vaddr) mprotect(mp->vaddr, mp->size + mp->delta, PROT_READ); #elif defined(Lynx) /* XXX this doesn't allow enable after disable */ smem_create(NULL, mp->vaddr, mp->size + mp->delta, SM_DETACH); smem_remove("XF86DGA"); #endif } SDL_NAME(XF86DGADirectVideoLL)(dis, screen, enable); return 1; }
static void removeIOSmem(void) { smem_create(NULL, (char *) ioBase, 0, SM_DETACH); smem_remove("IOBASE"); ioBase = MAP_FAILED; }
static inline void enable_os_io(void) { pciConfBase = (unsigned char *) smem_create("PCI-CONF", (char *)0x80800000, 64*1024, SM_READ|SM_WRITE); if (pciConfBase == (void *) -1) exit(1); }
static void UnMapVidMem(int ScreenNum, pointer Base, unsigned long Size) { int i; xf86MsgVerb(X_INFO, 3, "UnMapVidMem: Base/Ptr=0x%x Size=0x%x\n", Base, Size); for (i = 0; i < MAX_SMEMS; i++) { if (*smems[i].name && smems[i].ptr == Base && smems[i].Size == Size) { if (--smems[i].RefCnt > 0) return; (void)smem_create(NULL, smems[i].ptr, 0, SM_DETACH); xf86MsgVerb(X_INFO, 3, "UnMapVidMem: smem_create(%s, 0x%08x, ... " "SM_DETACH)\n", smems[i].name, smems[i].ptr); (void)smem_remove(smems[i].name); *smems[i].name = '\0'; smems[i].RefCnt = 0; return; } } xf86MsgVerb(X_WARNING, 2, "UnMapVidMem: no SMEM found for Base = %lx Size = %lx\n", Base, Size); }
int main() { one = 1; if (!(mem24=(int)smem_create("MEM24",(char *)(CPUADDR&~0xFFF),0x4, SM_WRITE | SM_READ))){ fprintf(stderr,"Unable to allocate MEM window for slave A24 memory"); exit(0); } p = (long *)(mem24 | (CPUADDR&0xFFF)); /*Location for VMEjump*/ dts=swap(*p); printf("Message box(4): VMEjump status was : 0x%x \n",dts); *p = swap(1); dts=swap(*p); printf("Message box(4): VMEjump status is now : 0x%x \n",dts); printf("VME eventbuilder is leaving infinite eventloop...\n"); smem_create("MEM24",(char *)mem24,0x4,SM_DETACH); smem_remove("MEM24"); return; }
static void smemCleanup(void) { int i; for (i = 0; i < MAX_SMEMS; i++) { if (*smems[i].name && smems[i].ptr) { (void)smem_create(NULL, smems[i].ptr, 0, SM_DETACH); (void)smem_remove(smems[i].name); *smems[i].name = '\0'; smems[i].ptr = NULL; smems[i].Base = 0; smems[i].Size = 0; smems[i].RefCnt = 0; } } }
void xf86EnableIO() { if (IOEnabled++ == 0) { ioBase = (unsigned char *) smem_create("IOBASE", (char *)PHYS_ISA_IO_SPACE, 64*1024, SM_READ|SM_WRITE); if (ioBase == MAP_FAILED) { --IOEnabled; FatalError("xf86EnableIO: Failed to map I/O\n"); } else { #ifdef DEBUG ErrorF("xf86EnableIO: mapped I/O at vaddr 0x%08x\n", ioBase); #endif atexit(removeIOSmem); } } return; }
static void * MapPhysAddress(unsigned long address, unsigned long size) { unsigned long offset, delta; int pagesize = -1; void *vaddr; MapPtr mp; #if defined(ISC) && defined(HAS_SVR3_MMAP) struct kd_memloc mloc; #elif defined(__EMX__) APIRET rc; ULONG action; HFILE hfd; #endif if ((mp = FindMap(address, size))) { mp->refcount++; return (void *)((unsigned long)mp->vaddr + mp->delta); } #if defined(_SC_PAGESIZE) && defined(HAS_SC_PAGESIZE) pagesize = sysconf(_SC_PAGESIZE); #endif #ifdef _SC_PAGE_SIZE if (pagesize == -1) pagesize = sysconf(_SC_PAGE_SIZE); #endif #ifdef HAS_GETPAGESIZE if (pagesize == -1) pagesize = getpagesize(); #endif #ifdef PAGE_SIZE if (pagesize == -1) pagesize = PAGE_SIZE; #endif if (pagesize == -1) pagesize = 4096; delta = address % pagesize; offset = address - delta; #if defined(ISC) && defined(HAS_SVR3_MMAP) if (mapFd < 0) { if ((mapFd = open("/dev/mmap", O_RDWR)) < 0) return NULL; } mloc.vaddr = (char *)0; mloc.physaddr = (char *)offset; mloc.length = size + delta; mloc.ioflg=1; if ((vaddr = (void *)ioctl(mapFd, MAP, &mloc)) == (void *)-1) return NULL; #elif defined (__EMX__) /* * Dragon warning here! /dev/pmap$ is never closed, except on progam exit. * Consecutive calling of this routine will make PMAP$ driver run out * of memory handles. Some umap/close mechanism should be provided */ rc = DosOpen("/dev/pmap$", &hfd, &action, 0, FILE_NORMAL, FILE_OPEN, OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYNONE, (PEAOP2)NULL); if (rc != 0) return NULL; { struct map_ioctl { union { ULONG phys; void* user; } a; ULONG size; } pmap,dmap; ULONG plen,dlen; #define XFREE86_PMAP 0x76 #define PMAP_MAP 0x44 pmap.a.phys = offset; pmap.size = size + delta; rc = DosDevIOCtl(hfd, XFREE86_PMAP, PMAP_MAP, (PULONG)&pmap, sizeof(pmap), &plen, (PULONG)&dmap, sizeof(dmap), &dlen); if (rc == 0) { vaddr = dmap.a.user; } } if (rc != 0) return NULL; #elif defined (Lynx) vaddr = (void *)smem_create("XF86DGA", (char *)offset, size + delta, SM_READ|SM_WRITE); #else #ifndef MAP_FILE #define MAP_FILE 0 #endif if (mapFd < 0) { if ((mapFd = open(DEV_MEM, O_RDWR)) < 0) return NULL; } vaddr = (void *)mmap(NULL, size + delta, PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, mapFd, (off_t)offset); if (vaddr == (void *)-1) return NULL; #endif if (!vaddr) { if (!(mp = AddMap())) return NULL; mp->physaddr = address; mp->size = size; mp->delta = delta; mp->vaddr = vaddr; mp->refcount = 1; } return (void *)((unsigned long)vaddr + delta); }
static inline void disable_os_io(void) { smem_create(NULL, (char *) pciConfBase, 0, SM_DETACH); smem_remove("PCI-CONF"); pciConfBase = NULL; }
static pointer MapVidMem(int ScreenNum, unsigned long Base, unsigned long Size, int flags) { static int once; int free_slot = -1; int i; if (!once) { atexit(smemCleanup); once = 1; } for (i = 0; i < MAX_SMEMS; i++) { if (!*smems[i].name && free_slot == -1) free_slot = i; if (smems[i].Base == Base && smems[i].Size == Size && *smems[i].name) { smems[i].RefCnt++; return smems[i].ptr; } } if (i == MAX_SMEMS && free_slot == -1) { FatalError("MapVidMem: failed to smem_create Base %x Size %x (out of SMEMS entries)\n", Base, Size); } i = free_slot; sprintf(smems[i].name, "Video-%d", i); smems[i].Base = Base; smems[i].Size = Size; xf86MsgVerb(X_INFO, 3, "MapVidMem: Base=0x%x Size=0x%x\n", Base, Size); #if defined(__powerpc__) if (((unsigned long)Base & PHYS_IO_MEM_START) != PHYS_IO_MEM_START) { Base = Base | PHYS_IO_MEM_START; } #endif smems[i].ptr = smem_create(smems[i].name, (char *)Base, Size, SM_READ|SM_WRITE); smems[i].RefCnt = 1; if (smems[i].ptr == NULL) { /* check if there is a stale segment around */ if (smem_remove(smems[i].name) == 0) { xf86Msg(X_INFO, "MapVidMem: removed stale smem_ segment %s\n", smems[i].name); smems[i].ptr = smem_create(smems[i].name, (char *)Base, Size, SM_READ|SM_WRITE); } if (smems[i].ptr == NULL) { *smems[i].name = '\0'; FatalError("MapVidMem: failed to smem_create Base %x Size %x (%s)\n", Base, Size, strerror(errno)); } } xf86MsgVerb(X_INFO, 3, "MapVidMem: Base=0x%x Size=0x%x Ptr=0x%x\n", Base, Size, smems[i].ptr); return smems[i].ptr; }