145749Smckusick /* 245749Smckusick * Copyright (c) 1988 University of Utah. 345749Smckusick * Copyright (c) 1991 The Regents of the University of California. 445749Smckusick * All rights reserved. 545749Smckusick * 645749Smckusick * This code is derived from software contributed to Berkeley by 745749Smckusick * the Systems Programming Group of the University of Utah Computer 845749Smckusick * Science Department. 945749Smckusick * 1045749Smckusick * %sccs.include.redist.c% 1145749Smckusick * 1245749Smckusick * from: Utah $Hdr: vm_unix.c 1.1 89/11/07$ 1345749Smckusick * 14*54915Storek * @(#)vm_unix.c 7.4 (Berkeley) 07/10/92 1545749Smckusick */ 1645749Smckusick 1745749Smckusick /* 1845749Smckusick * Traditional sbrk/grow interface to VM 1945749Smckusick */ 2053358Sbostic #include <sys/param.h> 2153358Sbostic #include <sys/systm.h> 2253358Sbostic #include <sys/proc.h> 2353358Sbostic #include <sys/resourcevar.h> 2445749Smckusick 2553358Sbostic #include <vm/vm.h> 2645749Smckusick 27*54915Storek struct obreak_args { 28*54915Storek char *nsiz; 29*54915Storek }; 3045749Smckusick /* ARGSUSED */ 3153358Sbostic int 3245749Smckusick obreak(p, uap, retval) 3345749Smckusick struct proc *p; 34*54915Storek struct obreak_args *uap; 3545749Smckusick int *retval; 3645749Smckusick { 3748386Skarels register struct vmspace *vm = p->p_vmspace; 3845749Smckusick vm_offset_t new, old; 3945749Smckusick int rv; 4045749Smckusick register int diff; 4145749Smckusick 4248386Skarels old = (vm_offset_t)vm->vm_daddr; 4345749Smckusick new = round_page(uap->nsiz); 4448386Skarels if ((int)(new - old) > p->p_rlimit[RLIMIT_DATA].rlim_cur) 4545749Smckusick return(ENOMEM); 4648386Skarels old = round_page(old + ctob(vm->vm_dsize)); 4745749Smckusick diff = new - old; 4845749Smckusick if (diff > 0) { 4948386Skarels rv = vm_allocate(&vm->vm_map, &old, diff, FALSE); 5045749Smckusick if (rv != KERN_SUCCESS) { 5145749Smckusick uprintf("sbrk: grow failed, return = %d\n", rv); 5245749Smckusick return(ENOMEM); 5345749Smckusick } 5448386Skarels vm->vm_dsize += btoc(diff); 5545749Smckusick } else if (diff < 0) { 5645749Smckusick diff = -diff; 5748386Skarels rv = vm_deallocate(&vm->vm_map, new, diff); 5845749Smckusick if (rv != KERN_SUCCESS) { 5945749Smckusick uprintf("sbrk: shrink failed, return = %d\n", rv); 6045749Smckusick return(ENOMEM); 6145749Smckusick } 6248386Skarels vm->vm_dsize -= btoc(diff); 6345749Smckusick } 6445749Smckusick return(0); 6545749Smckusick } 6645749Smckusick 6745749Smckusick /* 6848386Skarels * Enlarge the "stack segment" to include the specified 6948386Skarels * stack pointer for the process. 7045749Smckusick */ 7153358Sbostic int 7248386Skarels grow(p, sp) 7348386Skarels struct proc *p; 7445749Smckusick unsigned sp; 7545749Smckusick { 7648386Skarels register struct vmspace *vm = p->p_vmspace; 7745749Smckusick register int si; 7845749Smckusick 7945749Smckusick /* 8045749Smckusick * For user defined stacks (from sendsig). 8145749Smckusick */ 8248386Skarels if (sp < (unsigned)vm->vm_maxsaddr) 8345749Smckusick return (0); 8445749Smckusick /* 8545749Smckusick * For common case of already allocated (from trap). 8645749Smckusick */ 8748386Skarels if (sp >= USRSTACK - ctob(vm->vm_ssize)) 8845749Smckusick return (1); 8945749Smckusick /* 9045749Smckusick * Really need to check vs limit and increment stack size if ok. 9145749Smckusick */ 9248386Skarels si = clrnd(btoc(USRSTACK-sp) - vm->vm_ssize); 9348386Skarels if (vm->vm_ssize + si > btoc(p->p_rlimit[RLIMIT_STACK].rlim_cur)) 9445749Smckusick return (0); 9548386Skarels vm->vm_ssize += si; 9645749Smckusick return (1); 9745749Smckusick } 9845749Smckusick 99*54915Storek struct ovadvise_args { 100*54915Storek int anom; 101*54915Storek }; 10245749Smckusick /* ARGSUSED */ 10353358Sbostic int 10445749Smckusick ovadvise(p, uap, retval) 10545749Smckusick struct proc *p; 106*54915Storek struct ovadvise_args *uap; 10745749Smckusick int *retval; 10845749Smckusick { 10945749Smckusick 11048386Skarels return (EINVAL); 11145749Smckusick } 112