| 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) %G% |
| 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 | } |