xref: /csrg-svn/sys/vm/vm_unix.c (revision 45749)
1*45749Smckusick /*
2*45749Smckusick  * Copyright (c) 1988 University of Utah.
3*45749Smckusick  * Copyright (c) 1991 The Regents of the University of California.
4*45749Smckusick  * All rights reserved.
5*45749Smckusick  *
6*45749Smckusick  * This code is derived from software contributed to Berkeley by
7*45749Smckusick  * the Systems Programming Group of the University of Utah Computer
8*45749Smckusick  * Science Department.
9*45749Smckusick  *
10*45749Smckusick  * %sccs.include.redist.c%
11*45749Smckusick  *
12*45749Smckusick  * from: Utah $Hdr: vm_unix.c 1.1 89/11/07$
13*45749Smckusick  *
14*45749Smckusick  *	@(#)vm_unix.c	7.1 (Berkeley) 12/05/90
15*45749Smckusick  */
16*45749Smckusick 
17*45749Smckusick /*
18*45749Smckusick  * Traditional sbrk/grow interface to VM
19*45749Smckusick  */
20*45749Smckusick #include "param.h"
21*45749Smckusick #include "systm.h"
22*45749Smckusick #include "user.h"
23*45749Smckusick #include "proc.h"
24*45749Smckusick 
25*45749Smckusick #include "../vm/vm_param.h"
26*45749Smckusick #include "machine/vmparam.h"
27*45749Smckusick 
28*45749Smckusick /* ARGSUSED */
29*45749Smckusick obreak(p, uap, retval)
30*45749Smckusick 	struct proc *p;
31*45749Smckusick 	struct args {
32*45749Smckusick 		char	*nsiz;
33*45749Smckusick 	} *uap;
34*45749Smckusick 	int *retval;
35*45749Smckusick {
36*45749Smckusick 	vm_offset_t new, old;
37*45749Smckusick 	int rv;
38*45749Smckusick 	register int diff;
39*45749Smckusick 
40*45749Smckusick 	old = (vm_offset_t)u.u_daddr;
41*45749Smckusick 	new = round_page(uap->nsiz);
42*45749Smckusick 	if ((int)(new - old) > u.u_rlimit[RLIMIT_DATA].rlim_cur)
43*45749Smckusick 		return(ENOMEM);
44*45749Smckusick 	old = round_page(old + ctob(u.u_dsize));
45*45749Smckusick 	diff = new - old;
46*45749Smckusick 	if (diff > 0) {
47*45749Smckusick 		rv = vm_allocate(p->p_map, &old, diff, FALSE);
48*45749Smckusick 		if (rv != KERN_SUCCESS) {
49*45749Smckusick 			uprintf("sbrk: grow failed, return = %d\n", rv);
50*45749Smckusick 			return(ENOMEM);
51*45749Smckusick 		}
52*45749Smckusick 		u.u_dsize += btoc(diff);
53*45749Smckusick 	} else if (diff < 0) {
54*45749Smckusick 		diff = -diff;
55*45749Smckusick 		rv = vm_deallocate(p->p_map, new, diff);
56*45749Smckusick 		if (rv != KERN_SUCCESS) {
57*45749Smckusick 			uprintf("sbrk: shrink failed, return = %d\n", rv);
58*45749Smckusick 			return(ENOMEM);
59*45749Smckusick 		}
60*45749Smckusick 		u.u_dsize -= btoc(diff);
61*45749Smckusick 	}
62*45749Smckusick 	return(0);
63*45749Smckusick }
64*45749Smckusick 
65*45749Smckusick /*
66*45749Smckusick  * grow the stack to include the SP
67*45749Smckusick  * true return if successful.
68*45749Smckusick  */
69*45749Smckusick grow(sp)
70*45749Smckusick 	unsigned sp;
71*45749Smckusick {
72*45749Smckusick 	register int si;
73*45749Smckusick 
74*45749Smckusick 	/*
75*45749Smckusick 	 * For user defined stacks (from sendsig).
76*45749Smckusick 	 */
77*45749Smckusick 	if (sp < (unsigned)u.u_maxsaddr)
78*45749Smckusick 		return (0);
79*45749Smckusick 	/*
80*45749Smckusick 	 * For common case of already allocated (from trap).
81*45749Smckusick 	 */
82*45749Smckusick 	if (sp >= USRSTACK-ctob(u.u_ssize))
83*45749Smckusick 		return (1);
84*45749Smckusick 	/*
85*45749Smckusick 	 * Really need to check vs limit and increment stack size if ok.
86*45749Smckusick 	 */
87*45749Smckusick 	si = clrnd(btoc(USRSTACK-sp) - u.u_ssize);
88*45749Smckusick 	if (u.u_ssize+si > btoc(u.u_rlimit[RLIMIT_STACK].rlim_cur))
89*45749Smckusick 		return (0);
90*45749Smckusick 	u.u_ssize += si;
91*45749Smckusick 	return (1);
92*45749Smckusick }
93*45749Smckusick 
94*45749Smckusick /* ARGSUSED */
95*45749Smckusick ovadvise(p, uap, retval)
96*45749Smckusick 	struct proc *p;
97*45749Smckusick 	struct args {
98*45749Smckusick 		int	anom;
99*45749Smckusick 	} *uap;
100*45749Smckusick 	int *retval;
101*45749Smckusick {
102*45749Smckusick 
103*45749Smckusick }
104