vn_open now returns locked, so must unlock when done
[unix-history] / usr / src / sys / vm / vm_unix.c
... / ...
CommitLineData
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) %G%
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 */
28obreak(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 */
69grow(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 */
97ovadvise(p, uap, retval)
98 struct proc *p;
99 struct args {
100 int anom;
101 } *uap;
102 int *retval;
103{
104
105 return (EINVAL);
106}