xref: /original-bsd/sys/vm/vm_unix.c (revision b9df2d9d)
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