1*45749Smckusick /* 2*45749Smckusick * Copyright (c) 1988 University of Utah. 3*45749Smckusick * Copyright (c) 1991 The Regents of the University of California. 4*45749Smckusick * All rights reserved. 5*45749Smckusick * 6*45749Smckusick * This code is derived from software contributed to Berkeley by 7*45749Smckusick * the Systems Programming Group of the University of Utah Computer 8*45749Smckusick * Science Department. 9*45749Smckusick * 10*45749Smckusick * %sccs.include.redist.c% 11*45749Smckusick * 12*45749Smckusick * from: Utah $Hdr: vm_unix.c 1.1 89/11/07$ 13*45749Smckusick * 14*45749Smckusick * @(#)vm_unix.c 7.1 (Berkeley) 12/05/90 15*45749Smckusick */ 16*45749Smckusick 17*45749Smckusick /* 18*45749Smckusick * Traditional sbrk/grow interface to VM 19*45749Smckusick */ 20*45749Smckusick #include "param.h" 21*45749Smckusick #include "systm.h" 22*45749Smckusick #include "user.h" 23*45749Smckusick #include "proc.h" 24*45749Smckusick 25*45749Smckusick #include "../vm/vm_param.h" 26*45749Smckusick #include "machine/vmparam.h" 27*45749Smckusick 28*45749Smckusick /* ARGSUSED */ 29*45749Smckusick obreak(p, uap, retval) 30*45749Smckusick struct proc *p; 31*45749Smckusick struct args { 32*45749Smckusick char *nsiz; 33*45749Smckusick } *uap; 34*45749Smckusick int *retval; 35*45749Smckusick { 36*45749Smckusick vm_offset_t new, old; 37*45749Smckusick int rv; 38*45749Smckusick register int diff; 39*45749Smckusick 40*45749Smckusick old = (vm_offset_t)u.u_daddr; 41*45749Smckusick new = round_page(uap->nsiz); 42*45749Smckusick if ((int)(new - old) > u.u_rlimit[RLIMIT_DATA].rlim_cur) 43*45749Smckusick return(ENOMEM); 44*45749Smckusick old = round_page(old + ctob(u.u_dsize)); 45*45749Smckusick diff = new - old; 46*45749Smckusick if (diff > 0) { 47*45749Smckusick rv = vm_allocate(p->p_map, &old, diff, FALSE); 48*45749Smckusick if (rv != KERN_SUCCESS) { 49*45749Smckusick uprintf("sbrk: grow failed, return = %d\n", rv); 50*45749Smckusick return(ENOMEM); 51*45749Smckusick } 52*45749Smckusick u.u_dsize += btoc(diff); 53*45749Smckusick } else if (diff < 0) { 54*45749Smckusick diff = -diff; 55*45749Smckusick rv = vm_deallocate(p->p_map, new, diff); 56*45749Smckusick if (rv != KERN_SUCCESS) { 57*45749Smckusick uprintf("sbrk: shrink failed, return = %d\n", rv); 58*45749Smckusick return(ENOMEM); 59*45749Smckusick } 60*45749Smckusick u.u_dsize -= btoc(diff); 61*45749Smckusick } 62*45749Smckusick return(0); 63*45749Smckusick } 64*45749Smckusick 65*45749Smckusick /* 66*45749Smckusick * grow the stack to include the SP 67*45749Smckusick * true return if successful. 68*45749Smckusick */ 69*45749Smckusick grow(sp) 70*45749Smckusick unsigned sp; 71*45749Smckusick { 72*45749Smckusick register int si; 73*45749Smckusick 74*45749Smckusick /* 75*45749Smckusick * For user defined stacks (from sendsig). 76*45749Smckusick */ 77*45749Smckusick if (sp < (unsigned)u.u_maxsaddr) 78*45749Smckusick return (0); 79*45749Smckusick /* 80*45749Smckusick * For common case of already allocated (from trap). 81*45749Smckusick */ 82*45749Smckusick if (sp >= USRSTACK-ctob(u.u_ssize)) 83*45749Smckusick return (1); 84*45749Smckusick /* 85*45749Smckusick * Really need to check vs limit and increment stack size if ok. 86*45749Smckusick */ 87*45749Smckusick si = clrnd(btoc(USRSTACK-sp) - u.u_ssize); 88*45749Smckusick if (u.u_ssize+si > btoc(u.u_rlimit[RLIMIT_STACK].rlim_cur)) 89*45749Smckusick return (0); 90*45749Smckusick u.u_ssize += si; 91*45749Smckusick return (1); 92*45749Smckusick } 93*45749Smckusick 94*45749Smckusick /* ARGSUSED */ 95*45749Smckusick ovadvise(p, uap, retval) 96*45749Smckusick struct proc *p; 97*45749Smckusick struct args { 98*45749Smckusick int anom; 99*45749Smckusick } *uap; 100*45749Smckusick int *retval; 101*45749Smckusick { 102*45749Smckusick 103*45749Smckusick } 104