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