|
|
1.1 ! root 1: /*% cyntax -c -DKERNEL % && cc -c -DKERNEL % ! 2: * I/O page driver. ! 3: * Maps device registers into user address space on open. ! 4: * Ioctl gets virtual address of registers. ! 5: * Used for ITI framebuffer and miscellaneous hackage. ! 6: */ ! 7: #include "sys/param.h" ! 8: #include "sys/conf.h" ! 9: #include "sys/user.h" ! 10: #include "sys/ubaddr.h" ! 11: #include "sys/pte.h" ! 12: #include "sys/pgio.h" ! 13: extern struct ubaddr pgaddr[]; /* defined in conf */ ! 14: extern int pgcnt; /* defined in conf */ ! 15: extern caddr_t pgcaddr[]; /* defined in conf. 0 when closed */ ! 16: int pgopen(), pgclose(), pgioctl(); ! 17: struct cdevsw pgcdev=cdinit(pgopen, pgclose, nodev, nodev, pgioctl); ! 18: static maptouser(vaddress) ! 19: caddr_t vaddress; ! 20: { ! 21: Sysmap[((unsigned)vaddress-0x80000000)>>9].pg_prot=PG_UW>>27; ! 22: } ! 23: pgopen(dev, flag) ! 24: dev_t dev; ! 25: { ! 26: register d=minor(dev); ! 27: register caddr_t *p=&pgcaddr[d]; ! 28: if(d>=pgcnt ! 29: || *p ! 30: || (*p=ubaddr(&pgaddr[d]))==0 ! 31: || ubbadaddr(pgaddr[d].ubno, *p, sizeof(short))) ! 32: u.u_error=ENXIO; ! 33: else ! 34: maptouser(*p); ! 35: } ! 36: pgclose(dev) ! 37: dev_t dev; ! 38: { ! 39: register caddr_t *p=&pgcaddr[minor(dev)]; ! 40: *p=0; ! 41: } ! 42: pgioctl(dev, cmd, arg, flag) ! 43: dev_t dev; ! 44: caddr_t arg; ! 45: { ! 46: switch(cmd){ ! 47: case PGADDR: ! 48: copyout((caddr_t)&pgcaddr[minor(dev)], arg, sizeof(caddr_t)); ! 49: break; ! 50: default: ! 51: return (ENOTTY); ! 52: } ! 53: return (0); ! 54: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.