|
|
1.1 root 1: /* mem.c 4.3 81/03/08 */
2:
3: /*
4: * Memory special file
5: * minor device 0 is physical memory
6: * minor device 1 is kernel memory
7: * minor device 2 is EOF/RATHOLE
8: * minor device 3 is unibus memory (addressed by shorts)
9: * minor device 4 is public part of kernel memory (read only)
10: * minor device 5 is processor registers
11: */
12:
13: #include "../h/param.h"
14: #include "../h/dir.h"
15: #include "../h/user.h"
16: #include "../h/conf.h"
17: #include "../h/buf.h"
18: #include "../h/systm.h"
19: #include "../h/pte.h"
20: #include "../h/mtpr.h"
21: #include "../h/vm.h"
22: #include "../h/cmap.h"
23: #include "sparam.h"
24:
25: #define SYSADR ((caddr_t)0x80000000) /* virtual address of system seg. */
26:
27: #ifndef NBLKBIG
28: #define NBLKBIG 0
29: #endif
30: #define NBLKDATA (1024*NBLKBIG + 64*NBLK64 + 16*NBLK16 + 4*NBLK4)
31:
32: extern u_char blkdata[];
33:
34: mmread(dev)
35: {
36: register int o; long lbuf;
37: register unsigned c, v;
38:
39: switch (minor(dev)) {
40:
41: case 0:
42: while (u.u_count != 0 && u.u_error == 0) {
43: if (fubyte(u.u_base) == -1)
44: goto fault;
45: v = btop(u.u_offset);
46: *(int *)mmap = v | (PG_V | PG_KR);
47: mtpr(TBIS, vmmap);
48: o = (int)u.u_offset & PGOFSET;
49: c = min((unsigned)(NBPG - o), u.u_count);
50: c = min(c, (unsigned)(NBPG - ((int)u.u_base&PGOFSET)));
51: if (copyout((caddr_t)&vmmap[o], u.u_base, c))
52: goto fault;
53: u.u_count -= c;
54: u.u_base += c;
55: u.u_offset += c;
56: }
57: return;
58:
59: case 1:
60: c = u.u_count;
61: if (copyout((caddr_t)u.u_offset, u.u_base, c))
62: goto fault;
63: u.u_count = 0;
64: u.u_base += c;
65: u.u_offset += c;
66: return;
67:
68: case 2:
69: return;
70:
71: case 3:
72: if (!useracc(u.u_base, u.u_count, B_WRITE))
73: goto fault;
74: if (UNIcpy((caddr_t)u.u_offset, u.u_base, u.u_count, B_READ))
75: goto fault;
76: c = u.u_count;
77: u.u_count = 0;
78: u.u_base += c;
79: u.u_offset += c;
80: return;
81:
82: case 4:
83: if ((u_long)u.u_offset < (u_long)SYSADR)
84: goto fault;
85: c = u.u_count;
86:
87: #define EXCLUDE(laddr, maddr) \
88: if ((u_long)u.u_offset >= (u_long)(laddr)) { \
89: if ((u_long)u.u_offset < (u_long)(maddr)) \
90: goto fault; \
91: } else \
92: c = min(c, (u_long)(laddr) - (u_long)u.u_offset)
93:
94: /* cf. startup() in machdep.c */
95: EXCLUDE(buffers, buffers + BUFSIZE*nbuf);
96: EXCLUDE(blkdata, blkdata + NBLKDATA);
97: EXCLUDE(ecmap, 0xffffffff);
98:
99: if (!kernacc((caddr_t)u.u_offset, c, B_READ))
100: goto fault;
101: if (copyout((caddr_t)u.u_offset, u.u_base, c))
102: goto fault;
103: u.u_count -= c;
104: u.u_base += c;
105: u.u_offset += c;
106: return;
107:
108: case 5:
109: c = min(u.u_count, sizeof(long));
110: lbuf = umfpr(u.u_offset/sizeof(long));
111: if (copyout((caddr_t)&lbuf, u.u_base, c))
112: goto fault;
113: u.u_count -= c;
114: u.u_base += c;
115: u.u_offset += c;
116: return;
117: }
118: fault:
119: u.u_error = EFAULT;
120: return;
121: }
122:
123: mmwrite(dev)
124: {
125: register int o; long lbuf;
126: register unsigned c, v;
127:
128: switch (minor(dev)) {
129:
130: case 0:
131: while (u.u_count != 0 && u.u_error == 0) {
132: if (fubyte(u.u_base) == -1)
133: goto fault;
134: v = btop(u.u_offset);
135: *(int *)mmap = v | (PG_V | PG_KW);
136: mtpr(TBIS, vmmap);
137: o = (int)u.u_offset & PGOFSET;
138: c = min((unsigned)(NBPG - o), u.u_count);
139: c = min(c, (unsigned)(NBPG - ((int)u.u_base&PGOFSET)));
140: if (copyin(u.u_base, (caddr_t)&vmmap[o], c))
141: goto fault;
142: u.u_count -= c;
143: u.u_base += c;
144: u.u_offset += c;
145: }
146: return;
147:
148: case 1:
149: if (copyin(u.u_base, (caddr_t)u.u_offset, u.u_count))
150: goto fault;
151: u.u_base += u.u_count;
152: u.u_offset += u.u_count;
153: u.u_count = 0;
154: return;
155:
156: case 2:
157: u.u_offset += u.u_count;
158: u.u_count = 0;
159: return;
160:
161: case 3:
162: if (!useracc(u.u_base, u.u_count, B_READ))
163: goto fault;
164: if (UNIcpy((caddr_t)u.u_offset, u.u_base, u.u_count, B_WRITE))
165: goto fault;
166: u.u_base += u.u_count;
167: u.u_offset += u.u_count;
168: u.u_count = 0;
169: return;
170:
171: case 5:
172: if (u.u_count < sizeof(long))
173: goto fault;
174: if (copyin(u.u_base, (caddr_t)&lbuf, sizeof(long)))
175: goto fault;
176: if (umtpr(u.u_offset / sizeof(long), lbuf) == 0)
177: goto fault;
178: u.u_count -= sizeof(long);
179: u.u_base += sizeof(long);
180: u.u_offset += sizeof(long);
181: return;
182: }
183: fault:
184: u.u_error = EFAULT;
185: return;
186: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.