xref: /original-bsd/sys/vm/vm_unix.c (revision 2d1a7683)
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) 04/20/91
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 }
107