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