|
|
1.1 root 1: /*
2: * Memory special file
3: * minor device 0 is physical memory
4: * minor device 1 is kernel memory
5: * minor device 2 is EOF/RATHOLE
6: * minor device 3 is unibus memory (addressed by shorts)
7: * minor device 4 is obsolete
8: * minor device 5 is processor registers
9: */
10:
11: #include "sys/param.h"
12: #include "sys/user.h"
13: #include "sys/buf.h"
14: #include "sys/conf.h"
15: #include "sys/pte.h"
16: #include "sys/mtpr.h"
17: #include "sys/vm.h"
18:
19: int mmread(), mmwrite();
20: struct cdevsw mmcdev = cdinit(nulldev, nulldev, mmread, mmwrite, nodev);
21:
22: char *vmmap;
23: struct pte *mmap;
24:
25: mmread(dev)
26: {
27: register int o; long lbuf;
28: register unsigned c, v;
29:
30: switch (minor(dev)) {
31:
32: case 0:
33: while (u.u_count != 0 && u.u_error == 0) {
34: if (fubyte(u.u_base) == -1)
35: goto fault;
36: v = btop(Ltol(u.u_offset));
37: *(int *)mmap = v | (PG_V | PG_KR);
38: mtpr(TBIS, vmmap);
39: o = Ltol(u.u_offset) & PGOFSET;
40: c = min((unsigned)(NBPG - o), u.u_count);
41: c = min(c, (unsigned)(NBPG - ((int)u.u_base&PGOFSET)));
42: if (copyout((caddr_t)&vmmap[o], u.u_base, c))
43: goto fault;
44: u.u_count -= c;
45: u.u_base += c;
46: u.u_offset = Lladd(u.u_offset, c);
47: }
48: return;
49:
50: case 1:
51: iomove((caddr_t)Ltol(u.u_offset), u.u_count, B_READ);
52: return;
53:
54: case 2:
55: return;
56:
57: case 3:
58: if (!useracc(u.u_base, u.u_count, B_WRITE))
59: goto fault;
60: if (UNIcpy((caddr_t)Ltol(u.u_offset), u.u_base, u.u_count, B_READ))
61: goto fault;
62: c = u.u_count;
63: u.u_count = 0;
64: u.u_base += c;
65: u.u_offset = Lladd(u.u_offset, c);
66: return;
67:
68: case 5:
69: c = min(u.u_count, sizeof(long));
70: lbuf = umfpr(Ltol(u.u_offset)/sizeof(long));
71: if (copyout((caddr_t)&lbuf, u.u_base, c))
72: goto fault;
73: u.u_count -= c;
74: u.u_base += c;
75: u.u_offset = Lladd(u.u_offset, c);
76: return;
77: }
78: fault:
79: u.u_error = EFAULT;
80: return;
81: }
82:
83: mmwrite(dev)
84: {
85: register int o; long lbuf;
86: register unsigned c, v;
87:
88: switch (minor(dev)) {
89:
90: case 0:
91: while (u.u_count != 0 && u.u_error == 0) {
92: if (fubyte(u.u_base) == -1)
93: goto fault;
94: v = btop(Ltol(u.u_offset));
95: *(int *)mmap = v | (PG_V | PG_KW);
96: mtpr(TBIS, vmmap);
97: o = Ltol(u.u_offset) & PGOFSET;
98: c = min((unsigned)(NBPG - o), u.u_count);
99: c = min(c, (unsigned)(NBPG - ((int)u.u_base&PGOFSET)));
100: if (copyin(u.u_base, (caddr_t)&vmmap[o], c))
101: goto fault;
102: u.u_count -= c;
103: u.u_base += c;
104: u.u_offset = Lladd(u.u_offset, c);
105: }
106: return;
107:
108: case 1:
109: iomove((caddr_t)Ltol(u.u_offset), u.u_count, B_WRITE);
110: return;
111:
112: case 2:
113: u.u_offset = Lladd(u.u_offset, u.u_count);
114: u.u_count = 0;
115: return;
116:
117: case 3:
118: if (!useracc(u.u_base, u.u_count, B_READ))
119: goto fault;
120: if (UNIcpy((caddr_t)Ltol(u.u_offset), u.u_base, u.u_count, B_WRITE))
121: goto fault;
122: u.u_base += u.u_count;
123: u.u_offset = Lladd(u.u_offset, u.u_count);
124: u.u_count = 0;
125: return;
126:
127: case 5:
128: if (u.u_count < sizeof(long))
129: goto fault;
130: if (copyin(u.u_base, (caddr_t)&lbuf, sizeof(long)))
131: goto fault;
132: if (umtpr(Ltol(u.u_offset) / sizeof(long), lbuf) == 0)
133: goto fault;
134: u.u_count -= sizeof(long);
135: u.u_base += sizeof(long);
136: u.u_offset = Lladd(u.u_offset, sizeof(long));
137: return;
138: }
139: fault:
140: u.u_error = EFAULT;
141: return;
142: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.