|
|
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.