* Copyright (c) 1988 University of Utah.
* Copyright (c) 1991, 1993
* The Regents of the University of California. All rights reserved.
* This code is derived from software contributed to Berkeley by
* the Systems Programming Group of the University of Utah Computer
* %sccs.include.redist.c%
* from: Utah $Hdr: vm_unix.c 1.1 89/11/07$
* @(#)vm_unix.c 8.1 (Berkeley) %G%
* Traditional sbrk/grow interface to VM
#include <sys/resourcevar.h>
register struct vmspace
*vm
= p
->p_vmspace
;
old
= (vm_offset_t
)vm
->vm_daddr
;
new = round_page(uap
->nsiz
);
if ((int)(new - old
) > p
->p_rlimit
[RLIMIT_DATA
].rlim_cur
)
old
= round_page(old
+ ctob(vm
->vm_dsize
));
rv
= vm_allocate(&vm
->vm_map
, &old
, diff
, FALSE
);
if (rv
!= KERN_SUCCESS
) {
uprintf("sbrk: grow failed, return = %d\n", rv
);
vm
->vm_dsize
+= btoc(diff
);
rv
= vm_deallocate(&vm
->vm_map
, new, diff
);
if (rv
!= KERN_SUCCESS
) {
uprintf("sbrk: shrink failed, return = %d\n", rv
);
vm
->vm_dsize
-= btoc(diff
);
* Enlarge the "stack segment" to include the specified
* stack pointer for the process.
register struct vmspace
*vm
= p
->p_vmspace
;
* For user defined stacks (from sendsig).
if (sp
< (unsigned)vm
->vm_maxsaddr
)
* For common case of already allocated (from trap).
if (sp
>= USRSTACK
- ctob(vm
->vm_ssize
))
* Really need to check vs limit and increment stack size if ok.
si
= clrnd(btoc(USRSTACK
-sp
) - vm
->vm_ssize
);
if (vm
->vm_ssize
+ si
> btoc(p
->p_rlimit
[RLIMIT_STACK
].rlim_cur
))
struct ovadvise_args
*uap
;