|
|
1.1 root 1: /*
2: * Copyright (c) 1982, 1986 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: *
6: * @(#)vm_machdep.c 7.1 (Berkeley) 6/5/86
7: */
8:
9: #include "pte.h"
10:
11: #include "param.h"
12: #include "systm.h"
13: #include "dir.h"
14: #include "user.h"
15: #include "proc.h"
16: #include "cmap.h"
17: #include "mount.h"
18: #include "vm.h"
19: #include "text.h"
20:
21: #include "mtpr.h"
22:
23: /*
24: * Set a red zone in the kernel stack after the u. area.
25: */
26: setredzone(pte, vaddr)
27: register struct pte *pte;
28: caddr_t vaddr;
29: {
30:
31: pte += (sizeof (struct user) + NBPG - 1) / NBPG;
32: *(int *)pte &= ~PG_PROT;
33: *(int *)pte |= PG_URKR;
34: if (vaddr)
35: mtpr(TBIS, vaddr + sizeof (struct user));
36: }
37:
38: #ifndef mapin
39: mapin(pte, v, pfnum, count, prot)
40: struct pte *pte;
41: u_int v, pfnum;
42: int count, prot;
43: {
44:
45: while (count > 0) {
46: *(int *)pte++ = pfnum | prot;
47: mtpr(TBIS, ptob(v));
48: v++;
49: pfnum++;
50: count--;
51: }
52: }
53: #endif
54:
55: #ifdef notdef
56: /*ARGSUSED*/
57: mapout(pte, size)
58: register struct pte *pte;
59: int size;
60: {
61:
62: panic("mapout");
63: }
64: #endif
65:
66: /*
67: * Check for valid program size
68: * NB - Check data and data growth separately as they may overflow
69: * when summed together.
70: */
71: chksize(ts, ids, uds, ss)
72: unsigned ts, ids, uds, ss;
73: {
74: extern unsigned maxtsize;
75:
76: if (ctob(ts) > maxtsize ||
77: ctob(ids) > u.u_rlimit[RLIMIT_DATA].rlim_cur ||
78: ctob(uds) > u.u_rlimit[RLIMIT_DATA].rlim_cur ||
79: ctob(ids + uds) > u.u_rlimit[RLIMIT_DATA].rlim_cur ||
80: ctob(ss) > u.u_rlimit[RLIMIT_STACK].rlim_cur) {
81: u.u_error = ENOMEM;
82: return (1);
83: }
84: return (0);
85: }
86:
87: /*ARGSUSED*/
88: newptes(pte, v, size)
89: register struct pte *pte;
90: u_int v;
91: register int size;
92: {
93: register caddr_t a = ptob(v);
94:
95: #ifdef lint
96: pte = pte;
97: #endif
98: if (size >= 8) {
99: mtpr(TBIA, 0);
100: return;
101: }
102: while (size > 0) {
103: mtpr(TBIS, a);
104: a += NBPG;
105: size--;
106: }
107: }
108:
109: /*
110: * Change protection codes of text segment.
111: * Have to flush translation buffer since this
112: * affect virtual memory mapping of current process.
113: */
114: chgprot(addr, tprot)
115: caddr_t addr;
116: long tprot;
117: {
118: unsigned v;
119: int tp;
120: register struct pte *pte;
121: register struct cmap *c;
122:
123: v = clbase(btop(addr));
124: if (!isatsv(u.u_procp, v)) {
125: u.u_error = EFAULT;
126: return (0);
127: }
128: tp = vtotp(u.u_procp, v);
129: pte = tptopte(u.u_procp, tp);
130: if (pte->pg_fod == 0 && pte->pg_pfnum) {
131: c = &cmap[pgtocm(pte->pg_pfnum)];
132: if (c->c_blkno && c->c_mdev != MSWAPX)
133: munhash(mount[c->c_mdev].m_dev,
134: (daddr_t)(u_long)c->c_blkno);
135: }
136: *(int *)pte &= ~PG_PROT;
137: *(int *)pte |= tprot;
138: distcl(pte);
139: tbiscl(v);
140: return (1);
141: }
142:
143: settprot(tprot)
144: long tprot;
145: {
146: register int *ptaddr, i;
147:
148: ptaddr = (int *)mfpr(P0BR);
149: for (i = 0; i < u.u_tsize; i++) {
150: ptaddr[i] &= ~PG_PROT;
151: ptaddr[i] |= tprot;
152: }
153: mtpr(TBIA, 0);
154: }
155:
156: /*
157: * Rest are machine-dependent
158: */
159:
160: getmemc(addr)
161: caddr_t addr;
162: {
163: register int c;
164: struct pte savemap;
165:
166: savemap = mmap[0];
167: *(int *)mmap = PG_V | PG_KR | btop(addr);
168: mtpr(TBIS, vmmap);
169: c = *(char *)&vmmap[(int)addr & PGOFSET];
170: mmap[0] = savemap;
171: mtpr(TBIS, vmmap);
172: return (c & 0377);
173: }
174:
175: putmemc(addr, val)
176: caddr_t addr;
177: {
178: struct pte savemap;
179:
180: savemap = mmap[0];
181: *(int *)mmap = PG_V | PG_KW | btop(addr);
182: mtpr(TBIS, vmmap);
183: *(char *)&vmmap[(int)addr & PGOFSET] = val;
184: mmap[0] = savemap;
185: mtpr(TBIS, vmmap);
186: }
187:
188: /*
189: * Move pages from one kernel virtual address to another.
190: * Both addresses are assumed to reside in the Sysmap,
191: * and size must be a multiple of CLSIZE.
192: */
193: pagemove(from, to, size)
194: register caddr_t from, to;
195: int size;
196: {
197: register struct pte *fpte, *tpte;
198:
199: if (size % CLBYTES)
200: panic("pagemove");
201: fpte = &Sysmap[btop(from - 0x80000000)];
202: tpte = &Sysmap[btop(to - 0x80000000)];
203: while (size > 0) {
204: *tpte++ = *fpte;
205: *(int *)fpte++ = 0;
206: mtpr(TBIS, from);
207: mtpr(TBIS, to);
208: from += NBPG;
209: to += NBPG;
210: size -= NBPG;
211: }
212: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.