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