xref: /original-bsd/sys/vm/vm_unix.c (revision fac0c393)
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
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
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
104 ovadvise(p, uap, retval)
105 	struct proc *p;
106 	struct ovadvise_args *uap;
107 	int *retval;
108 {
109 
110 	return (EINVAL);
111 }
112