Annotation of 43BSDReno/sys/vax/vm_machdep.c, revision 1.1.1.1

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.9 (Berkeley) 6/21/90
                      7:  */
                      8: 
                      9: #include "param.h"
                     10: #include "systm.h"
                     11: #include "user.h"
                     12: #include "proc.h"
                     13: #include "cmap.h"
                     14: #include "vm.h"
                     15: #include "text.h"
                     16: 
                     17: #include "pte.h"
                     18: #include "mtpr.h"
                     19: 
                     20: /*
                     21:  * Set a red zone in the kernel stack after the u. area.
                     22:  */
                     23: setredzone(pte, vaddr)
                     24:        register struct pte *pte;
                     25:        caddr_t vaddr;
                     26: {
                     27: 
                     28:        pte += (sizeof (struct user) + NBPG - 1) / NBPG;
                     29:        *(int *)pte &= ~PG_PROT;
                     30:        *(int *)pte |= PG_URKR;
                     31:        if (vaddr)
                     32:                mtpr(TBIS, vaddr + sizeof (struct user));
                     33: }
                     34: 
                     35: /*
                     36:  * Check for valid program size
                     37:  * NB - Check data and data growth separately as they may overflow 
                     38:  * when summed together.
                     39:  */
                     40: chksize(ts, ids, uds, ss)
                     41:        unsigned ts, ids, uds, ss;
                     42: {
                     43:        extern unsigned maxtsize;
                     44: 
                     45:        if (ctob(ts) > maxtsize ||
                     46:            ctob(ids) > u.u_rlimit[RLIMIT_DATA].rlim_cur ||
                     47:            ctob(uds) > u.u_rlimit[RLIMIT_DATA].rlim_cur ||
                     48:            ctob(ids + uds) > u.u_rlimit[RLIMIT_DATA].rlim_cur ||
                     49:            ctob(ss) > u.u_rlimit[RLIMIT_STACK].rlim_cur) {
                     50:                return (ENOMEM);
                     51:        }
                     52:        return (0);
                     53: }
                     54: 
                     55: /*ARGSUSED*/
                     56: newptes(pte, v, size)
                     57:        register struct pte *pte;
                     58:        u_int v;
                     59:        register int size;
                     60: {
                     61:        register caddr_t a = ptob(v);
                     62: 
                     63: #ifdef lint
                     64:        pte = pte;
                     65: #endif
                     66:        if (size >= 8) {
                     67:                mtpr(TBIA, 0);
                     68:                return;
                     69:        }
                     70:        while (size > 0) {
                     71:                mtpr(TBIS, a);
                     72:                a += NBPG;
                     73:                size--;
                     74:        }
                     75: }
                     76: 
                     77: /*
                     78:  * Change protection codes of text segment.
                     79:  * Have to flush translation buffer since this
                     80:  * affect virtual memory mapping of current process.
                     81:  */
                     82: chgprot(addr, tprot)
                     83:        caddr_t addr;
                     84:        long tprot;
                     85: {
                     86:        unsigned v;
                     87:        int tp;
                     88:        register struct pte *pte;
                     89:        register struct cmap *c;
                     90: 
                     91:        v = clbase(btop(addr));
                     92:        if (!isatsv(u.u_procp, v))
                     93:                return (EFAULT);
                     94:        tp = vtotp(u.u_procp, v);
                     95:        pte = tptopte(u.u_procp, tp);
                     96:        if (pte->pg_fod == 0 && pte->pg_pfnum) {
                     97:                c = &cmap[pgtocm(pte->pg_pfnum)];
                     98:                if (c->c_blkno)
                     99:                        munhash(c->c_vp, (daddr_t)(u_long)c->c_blkno);
                    100:        }
                    101:        *(int *)pte &= ~PG_PROT;
                    102:        *(int *)pte |= tprot;
                    103:        distcl(pte);
                    104:        tbiscl(v);
                    105:        return (0);
                    106: }
                    107: 
                    108: settprot(tprot)
                    109:        long tprot;
                    110: {
                    111:        register int *ptaddr, i;
                    112: 
                    113:        ptaddr = (int *)mfpr(P0BR);
                    114:        for (i = 0; i < u.u_tsize; i++) {
                    115:                ptaddr[i] &= ~PG_PROT;
                    116:                ptaddr[i] |= tprot;
                    117:        }
                    118:        mtpr(TBIA, 0);
                    119: }
                    120: 
                    121: /*
                    122:  * Rest are machine-dependent
                    123:  */
                    124: 
                    125: getmemc(addr)
                    126:        caddr_t addr;
                    127: {
                    128:        register int c;
                    129:        struct pte savemap;
                    130: 
                    131:        savemap = mmap[0];
                    132:        *(int *)mmap = PG_V | PG_KR | btop(addr);
                    133:        mtpr(TBIS, vmmap);
                    134:        c = *(char *)&vmmap[(int)addr & PGOFSET];
                    135:        mmap[0] = savemap;
                    136:        mtpr(TBIS, vmmap);
                    137:        return (c & 0377);
                    138: }
                    139: 
                    140: putmemc(addr, val)
                    141:        caddr_t addr;
                    142: {
                    143:        struct pte savemap;
                    144: 
                    145:        savemap = mmap[0];
                    146:        *(int *)mmap = PG_V | PG_KW | btop(addr);
                    147:        mtpr(TBIS, vmmap);
                    148:        *(char *)&vmmap[(int)addr & PGOFSET] = val;
                    149:        mmap[0] = savemap;
                    150:        mtpr(TBIS, vmmap);
                    151: }
                    152: 
                    153: /*
                    154:  * Move pages from one kernel virtual address to another.
                    155:  * Both addresses are assumed to reside in the Sysmap,
                    156:  * and size must be a multiple of CLSIZE.
                    157:  */
                    158: pagemove(from, to, size)
                    159:        register caddr_t from, to;
                    160:        int size;
                    161: {
                    162:        register struct pte *fpte, *tpte;
                    163: 
                    164:        if (size % CLBYTES)
                    165:                panic("pagemove");
                    166:        fpte = kvtopte(from);
                    167:        tpte = kvtopte(to);
                    168:        while (size > 0) {
                    169:                *tpte++ = *fpte;
                    170:                *(int *)fpte++ = 0;
                    171:                mtpr(TBIS, from);
                    172:                mtpr(TBIS, to);
                    173:                from += NBPG;
                    174:                to += NBPG;
                    175:                size -= NBPG;
                    176:        }
                    177: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.