|
|
1.1 root 1: /* mem.c 6.1 83/07/29 */
2:
3: /*
4: * Memory special file
5: */
6:
7: #include "../machine/pte.h"
8:
9: #include "../h/param.h"
10: #include "../h/dir.h"
11: #include "../h/user.h"
12: #include "../h/conf.h"
13: #include "../h/buf.h"
14: #include "../h/systm.h"
15: #include "../h/vm.h"
16: #include "../h/cmap.h"
17: #include "../h/uio.h"
18:
19: #include "../vax/mtpr.h"
20:
21: mmread(dev, uio)
22: dev_t dev;
23: struct uio *uio;
24: {
25:
26: return (mmrw(dev, uio, UIO_READ));
27: }
28:
29: mmwrite(dev, uio)
30: dev_t dev;
31: struct uio *uio;
32: {
33:
34: return (mmrw(dev, uio, UIO_WRITE));
35: }
36:
37: mmrw(dev, uio, rw)
38: dev_t dev;
39: struct uio *uio;
40: enum uio_rw rw;
41: {
42: register int o;
43: register u_int c, v;
44: register struct iovec *iov;
45: int error = 0;
46: extern int umbabeg, umbaend;
47:
48:
49: while (uio->uio_resid > 0 && error == 0) {
50: iov = uio->uio_iov;
51: if (iov->iov_len == 0) {
52: uio->uio_iov++;
53: uio->uio_iovcnt--;
54: if (uio->uio_iovcnt < 0)
55: panic("mmrw");
56: continue;
57: }
58: switch (minor(dev)) {
59:
60: /* minor device 0 is physical memory */
61: case 0:
62: v = btop(uio->uio_offset);
63: if (v >= physmem)
64: goto fault;
65: *(int *)mmap = v | PG_V |
66: (rw == UIO_READ ? PG_KR : PG_KW);
67: mtpr(TBIS, vmmap);
68: o = (int)uio->uio_offset & PGOFSET;
69: c = min((u_int)(NBPG - o), (u_int)iov->iov_len);
70: c = min(c, (u_int)(NBPG - ((int)iov->iov_base&PGOFSET)));
71: error = uiomove((caddr_t)&vmmap[o], (int)c, rw, uio);
72: continue;
73:
74: /* minor device 1 is kernel memory */
75: case 1:
76: if ((caddr_t)uio->uio_offset < (caddr_t)&umbabeg &&
77: (caddr_t)uio->uio_offset + uio->uio_resid >= (caddr_t)&umbabeg)
78: goto fault;
79: if ((caddr_t)uio->uio_offset >= (caddr_t)&umbabeg &&
80: (caddr_t)uio->uio_offset < (caddr_t)&umbaend)
81: goto fault;
82: c = iov->iov_len;
83: if (!kernacc((caddr_t)uio->uio_offset, c, rw == UIO_READ ? B_READ : B_WRITE))
84: goto fault;
85: error = uiomove((caddr_t)uio->uio_offset, (int)c, rw, uio);
86: continue;
87:
88: /* minor device 2 is EOF/RATHOLE */
89: case 2:
90: if (rw == UIO_READ)
91: return (0);
92: c = iov->iov_len;
93: break;
94:
95: /* minor device 3 is unibus memory (addressed by shorts) */
96: case 3:
97: c = iov->iov_len;
98: if (!kernacc((caddr_t)uio->uio_offset, c, rw == UIO_READ ? B_READ : B_WRITE))
99: goto fault;
100: if (!useracc(iov->iov_base, c, rw == UIO_READ ? B_WRITE : B_READ))
101: goto fault;
102: error = UNIcpy((caddr_t)uio->uio_offset, iov->iov_base,
103: (int)c, rw);
104: break;
105: }
106: if (error)
107: break;
108: iov->iov_base += c;
109: iov->iov_len -= c;
110: uio->uio_offset += c;
111: uio->uio_resid -= c;
112: }
113: return (error);
114: fault:
115: return (EFAULT);
116: }
117:
118: /*
119: * UNIBUS Address Space <--> User Space transfer
120: */
121: UNIcpy(uniadd, usradd, n, rw)
122: caddr_t uniadd, usradd;
123: register int n;
124: enum uio_rw rw;
125: {
126: register short *from, *to;
127:
128: if (rw == UIO_READ) {
129: from = (short *)uniadd;
130: to = (short *)usradd;
131: } else {
132: from = (short *)usradd;
133: to = (short *)uniadd;
134: }
135: for (n >>= 1; n > 0; n--)
136: *to++ = *from++;
137: return (0);
138: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.