|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.