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

unix.superglobalmegacorp.com

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