vn_open now returns locked, so must unlock when done
[unix-history] / usr / src / sys / vm / vm_unix.c
CommitLineData
619edcce
KM
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 *
ffe0d082 14 * @(#)vm_unix.c 7.2 (Berkeley) %G%
619edcce
KM
15 */
16
17/*
18 * Traditional sbrk/grow interface to VM
19 */
20#include "param.h"
21#include "systm.h"
619edcce 22#include "proc.h"
ffe0d082 23#include "resourcevar.h"
619edcce 24
ffe0d082 25#include "vm.h"
619edcce
KM
26
27/* ARGSUSED */
28obreak(p, uap, retval)
29 struct proc *p;
30 struct args {
31 char *nsiz;
32 } *uap;
33 int *retval;
34{
ffe0d082 35 register struct vmspace *vm = p->p_vmspace;
619edcce
KM
36 vm_offset_t new, old;
37 int rv;
38 register int diff;
39
ffe0d082 40 old = (vm_offset_t)vm->vm_daddr;
619edcce 41 new = round_page(uap->nsiz);
ffe0d082 42 if ((int)(new - old) > p->p_rlimit[RLIMIT_DATA].rlim_cur)
619edcce 43 return(ENOMEM);
ffe0d082 44 old = round_page(old + ctob(vm->vm_dsize));
619edcce
KM
45 diff = new - old;
46 if (diff > 0) {
ffe0d082 47 rv = vm_allocate(&vm->vm_map, &old, diff, FALSE);
619edcce
KM
48 if (rv != KERN_SUCCESS) {
49 uprintf("sbrk: grow failed, return = %d\n", rv);
50 return(ENOMEM);
51 }
ffe0d082 52 vm->vm_dsize += btoc(diff);
619edcce
KM
53 } else if (diff < 0) {
54 diff = -diff;
ffe0d082 55 rv = vm_deallocate(&vm->vm_map, new, diff);
619edcce
KM
56 if (rv != KERN_SUCCESS) {
57 uprintf("sbrk: shrink failed, return = %d\n", rv);
58 return(ENOMEM);
59 }
ffe0d082 60 vm->vm_dsize -= btoc(diff);
619edcce
KM
61 }
62 return(0);
63}
64
65/*
ffe0d082
MK
66 * Enlarge the "stack segment" to include the specified
67 * stack pointer for the process.
619edcce 68 */
ffe0d082
MK
69grow(p, sp)
70 struct proc *p;
619edcce
KM
71 unsigned sp;
72{
ffe0d082 73 register struct vmspace *vm = p->p_vmspace;
619edcce
KM
74 register int si;
75
76 /*
77 * For user defined stacks (from sendsig).
78 */
ffe0d082 79 if (sp < (unsigned)vm->vm_maxsaddr)
619edcce
KM
80 return (0);
81 /*
82 * For common case of already allocated (from trap).
83 */
ffe0d082 84 if (sp >= USRSTACK - ctob(vm->vm_ssize))
619edcce
KM
85 return (1);
86 /*
87 * Really need to check vs limit and increment stack size if ok.
88 */
ffe0d082
MK
89 si = clrnd(btoc(USRSTACK-sp) - vm->vm_ssize);
90 if (vm->vm_ssize + si > btoc(p->p_rlimit[RLIMIT_STACK].rlim_cur))
619edcce 91 return (0);
ffe0d082 92 vm->vm_ssize += si;
619edcce
KM
93 return (1);
94}
95
96/* ARGSUSED */
97ovadvise(p, uap, retval)
98 struct proc *p;
99 struct args {
100 int anom;
101 } *uap;
102 int *retval;
103{
104
ffe0d082 105 return (EINVAL);
619edcce 106}