Annotation of researchv9/sys.vax/sys/vmsys.c, revision 1.1.1.1

1.1       root        1: /*     vmsys.c 4.11    81/04/23        */
                      2: 
                      3: #include "../h/param.h"
                      4: #include "../h/systm.h"
                      5: #include "../h/dir.h"
                      6: #include "../h/user.h"
                      7: #include "../h/proc.h"
                      8: #include "../h/reg.h"
                      9: #include "../h/file.h"
                     10: #include "../h/inode.h"
                     11: #include "../h/vm.h"
                     12: #include "../h/buf.h"
                     13: #include "../h/pte.h"
                     14: #include "../h/cmap.h"
                     15: #include "../h/mtpr.h"
                     16: #include "../h/vlimit.h"
                     17: #include "../h/trace.h"
                     18: #include "../h/vadvise.h"
                     19: 
                     20: vfork()
                     21: {
                     22: 
                     23:        fork1(1);
                     24: }
                     25: 
                     26: resuba()
                     27: {
                     28: 
                     29:        if (suser())
                     30:                ubareset(u.u_arg[0]);
                     31: }
                     32: 
                     33: futz()
                     34: {
                     35: 
                     36: }
                     37: 
                     38: int    both;
                     39: 
                     40: vadvise()
                     41: {
                     42:        register struct a {
                     43:                int     anom;
                     44:        } *uap;
                     45:        register struct proc *rp = u.u_procp;
                     46:        int oanom = rp->p_flag & SUANOM;
                     47:        register struct pte *pte;
                     48:        register struct cmap *c;
                     49:        register int i;
                     50: 
                     51:        uap = (struct a *)u.u_ap;
                     52: #ifdef TRACE
                     53:        trace(TR_VADVISE, uap->anom, u.u_procp->p_pid);
                     54: #endif
                     55:        rp->p_flag &= ~(SSEQL|SUANOM);
                     56:        switch (uap->anom) {
                     57: 
                     58:        case VA_ANOM:
                     59:                rp->p_flag |= SUANOM;
                     60:                break;
                     61: 
                     62:        case VA_SEQL:
                     63:                rp->p_flag |= SSEQL;
                     64:                break;
                     65:        }
                     66:        if (both || (oanom && (rp->p_flag & SUANOM) == 0)) {
                     67:                for (i = 0; i < rp->p_dsize; i += CLSIZE) {
                     68:                        pte = dptopte(rp, i);
                     69:                        if (pte->pg_v) {
                     70:                                c = &cmap[pgtocm(pte->pg_pfnum)];
                     71:                                if (c->c_lock)
                     72:                                        continue;
                     73:                                pte->pg_v = 0;
                     74:                                if (anycl(pte, pg_m))
                     75:                                        pte->pg_m = 1;
                     76:                                distcl(pte);
                     77:                        }
                     78:                }
                     79:                mtpr(TBIA, 0);
                     80:        }
                     81: }
                     82: 
                     83: vtimes()
                     84: {
                     85:        register struct a {
                     86:                struct  vtimes *par_vm;
                     87:                struct  vtimes *ch_vm;
                     88:        } *uap = (struct a *)u.u_ap;
                     89:        if (uap->par_vm) {
                     90:                if (copyout((caddr_t)&u.u_vm, (caddr_t)uap->par_vm,
                     91:                    sizeof(struct vtimes)) < 0)
                     92:                        u.u_error = EFAULT;
                     93:        }
                     94:        if (uap->ch_vm == 0)
                     95:                return;
                     96:        if (copyout((caddr_t)&u.u_cvm, (caddr_t)uap->ch_vm,
                     97:            sizeof(struct vtimes)) < 0)
                     98:                u.u_error = EFAULT;
                     99: }
                    100: 
                    101: vmsadd(vp, wp)
                    102:        register struct vtimes *vp, *wp;
                    103: {
                    104: 
                    105:        vp->vm_utime += wp->vm_utime;
                    106:        vp->vm_stime += wp->vm_stime;
                    107:        vp->vm_nswap += wp->vm_nswap;
                    108:        vp->vm_idsrss += wp->vm_idsrss;
                    109:        vp->vm_ixrss += wp->vm_ixrss;
                    110:        if (vp->vm_maxrss < wp->vm_maxrss)
                    111:                vp->vm_maxrss = wp->vm_maxrss;
                    112:        vp->vm_majflt += wp->vm_majflt;
                    113:        vp->vm_minflt += wp->vm_minflt;
                    114:        vp->vm_inblk += wp->vm_inblk;
                    115:        vp->vm_oublk += wp->vm_oublk;
                    116: }
                    117: 
                    118: /*
                    119:  * Affect per-process limits.
                    120:  * To just return old limit, specify negative new limit.
                    121:  */
                    122: vlimit()
                    123: {
                    124:        register struct a {
                    125:                unsigned which;
                    126:                int     limit;
                    127:        } *uap;
                    128: 
                    129:        uap = (struct a *)u.u_ap;
                    130:        if (uap->which > NLIMITS) {
                    131:                u.u_error = EINVAL;
                    132:                return;
                    133:        }
                    134:        u.u_r.r_val1 = u.u_limit[uap->which];
                    135:        if (uap->limit < 0)
                    136:                return;
                    137:        switch (uap->which) {
                    138: 
                    139:        case LIM_DATA:
                    140:                if (uap->limit > ctob(MAXDSIZ))
                    141:                        uap->limit = ctob(MAXDSIZ);
                    142:                break;
                    143: 
                    144:        case LIM_TEXT:
                    145:                if (uap->limit > ctob(MAXTSIZ))
                    146:                        uap->limit = ctob(MAXTSIZ);
                    147:                break;
                    148: 
                    149:        case LIM_STACK:
                    150:                if (uap->limit > ctob(MAXSSIZ))
                    151:                        uap->limit = ctob(MAXSSIZ);
                    152:                break;
                    153:        }
                    154:        if (u.u_limit[LIM_NORAISE] && uap->limit > u.u_limit[uap->which] &&
                    155:            !suser()) {
                    156:                u.u_error = EACCES;
                    157:                return;
                    158:        }
                    159:        u.u_limit[uap->which] = uap->limit;
                    160:        if (uap->which == LIM_MAXRSS)
                    161:                u.u_procp->p_maxrss = uap->limit/NBPG;
                    162: }
                    163: 
                    164: #ifdef TRACE
                    165: int    nvualarm;
                    166: 
                    167: vtrace()
                    168: {
                    169:        register struct a {
                    170:                int     request;
                    171:                int     value;
                    172:        } *uap;
                    173:        int vdoualarm();
                    174: 
                    175:        uap = (struct a *)u.u_ap;
                    176:        switch (uap->request) {
                    177: 
                    178:        case VTR_DISABLE:               /* disable a trace point */
                    179:        case VTR_ENABLE:                /* enable a trace point */
                    180:                if (uap->value < 0 || uap->value >= TR_NFLAGS)
                    181:                        u.u_error = EINVAL;
                    182:                else {
                    183:                        u.u_r.r_val1 = traceflags[uap->value];
                    184:                        traceflags[uap->value] = uap->request;
                    185:                }
                    186:                break;
                    187: 
                    188:        case VTR_VALUE:         /* return a trace point setting */
                    189:                if (uap->value < 0 || uap->value >= TR_NFLAGS)
                    190:                        u.u_error = EINVAL;
                    191:                else
                    192:                        u.u_r.r_val1 = traceflags[uap->value];
                    193:                break;
                    194: 
                    195:        case VTR_UALARM:        /* set a real-time ualarm, less than 1 min */
                    196:                if (uap->value <= 0 || uap->value > 60 * hz ||
                    197:                    nvualarm > 5)
                    198:                        u.u_error = EINVAL;
                    199:                else {
                    200:                        nvualarm++;
                    201:                        timeout(vdoualarm, (caddr_t)u.u_procp->p_pid,
                    202:                            uap->value);
                    203:                }
                    204:                break;
                    205: 
                    206:        case VTR_STAMP:
                    207:                trace(TR_STAMP, uap->value, 0);
                    208:                break;
                    209:        }
                    210: }
                    211: 
                    212: vdoualarm(arg)
                    213:        int arg;
                    214: {
                    215:        register struct proc *p;
                    216: 
                    217:        p = pfind(arg);
                    218:        if (p)
                    219:                psignal(p, 16);
                    220:        nvualarm--;
                    221: }
                    222: #endif

unix.superglobalmegacorp.com

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