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.3 (Berkeley) 05/04/92 15 */ 16 17 /* 18 * Traditional sbrk/grow interface to VM 19 */ 20 #include <sys/param.h> 21 #include <sys/systm.h> 22 #include <sys/proc.h> 23 #include <sys/resourcevar.h> 24 25 #include <vm/vm.h> 26 27 /* ARGSUSED */ 28 int 29 obreak(p, uap, retval) 30 struct proc *p; 31 struct args { 32 char *nsiz; 33 } *uap; 34 int *retval; 35 { 36 register struct vmspace *vm = p->p_vmspace; 37 vm_offset_t new, old; 38 int rv; 39 register int diff; 40 41 old = (vm_offset_t)vm->vm_daddr; 42 new = round_page(uap->nsiz); 43 if ((int)(new - old) > p->p_rlimit[RLIMIT_DATA].rlim_cur) 44 return(ENOMEM); 45 old = round_page(old + ctob(vm->vm_dsize)); 46 diff = new - old; 47 if (diff > 0) { 48 rv = vm_allocate(&vm->vm_map, &old, diff, FALSE); 49 if (rv != KERN_SUCCESS) { 50 uprintf("sbrk: grow failed, return = %d\n", rv); 51 return(ENOMEM); 52 } 53 vm->vm_dsize += btoc(diff); 54 } else if (diff < 0) { 55 diff = -diff; 56 rv = vm_deallocate(&vm->vm_map, new, diff); 57 if (rv != KERN_SUCCESS) { 58 uprintf("sbrk: shrink failed, return = %d\n", rv); 59 return(ENOMEM); 60 } 61 vm->vm_dsize -= btoc(diff); 62 } 63 return(0); 64 } 65 66 /* 67 * Enlarge the "stack segment" to include the specified 68 * stack pointer for the process. 69 */ 70 int 71 grow(p, sp) 72 struct proc *p; 73 unsigned sp; 74 { 75 register struct vmspace *vm = p->p_vmspace; 76 register int si; 77 78 /* 79 * For user defined stacks (from sendsig). 80 */ 81 if (sp < (unsigned)vm->vm_maxsaddr) 82 return (0); 83 /* 84 * For common case of already allocated (from trap). 85 */ 86 if (sp >= USRSTACK - ctob(vm->vm_ssize)) 87 return (1); 88 /* 89 * Really need to check vs limit and increment stack size if ok. 90 */ 91 si = clrnd(btoc(USRSTACK-sp) - vm->vm_ssize); 92 if (vm->vm_ssize + si > btoc(p->p_rlimit[RLIMIT_STACK].rlim_cur)) 93 return (0); 94 vm->vm_ssize += si; 95 return (1); 96 } 97 98 /* ARGSUSED */ 99 int 100 ovadvise(p, uap, retval) 101 struct proc *p; 102 struct args { 103 int anom; 104 } *uap; 105 int *retval; 106 { 107 108 return (EINVAL); 109 } 110