Deleted Added
full compact
vm_unix.c (1542) vm_unix.c (1549)
1/*
2 * Copyright (c) 1988 University of Utah.
3 * Copyright (c) 1991, 1993
4 * The Regents of the University of California. 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.

--- 36 unchanged lines hidden (view full) ---

45 */
46#include <sys/param.h>
47#include <sys/systm.h>
48#include <sys/proc.h>
49#include <sys/resourcevar.h>
50
51#include <vm/vm.h>
52
1/*
2 * Copyright (c) 1988 University of Utah.
3 * Copyright (c) 1991, 1993
4 * The Regents of the University of California. 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.

--- 36 unchanged lines hidden (view full) ---

45 */
46#include <sys/param.h>
47#include <sys/systm.h>
48#include <sys/proc.h>
49#include <sys/resourcevar.h>
50
51#include <vm/vm.h>
52
53extern int swap_pager_full;
54
53struct obreak_args {
54 char *nsiz;
55};
55struct obreak_args {
56 char *nsiz;
57};
58
56/* ARGSUSED */
57int
58obreak(p, uap, retval)
59 struct proc *p;
60 struct obreak_args *uap;
61 int *retval;
62{
63 register struct vmspace *vm = p->p_vmspace;
64 vm_offset_t new, old;
65 int rv;
66 register int diff;
67
68 old = (vm_offset_t)vm->vm_daddr;
69 new = round_page(uap->nsiz);
70 if ((int)(new - old) > p->p_rlimit[RLIMIT_DATA].rlim_cur)
71 return(ENOMEM);
72 old = round_page(old + ctob(vm->vm_dsize));
73 diff = new - old;
74 if (diff > 0) {
59/* ARGSUSED */
60int
61obreak(p, uap, retval)
62 struct proc *p;
63 struct obreak_args *uap;
64 int *retval;
65{
66 register struct vmspace *vm = p->p_vmspace;
67 vm_offset_t new, old;
68 int rv;
69 register int diff;
70
71 old = (vm_offset_t)vm->vm_daddr;
72 new = round_page(uap->nsiz);
73 if ((int)(new - old) > p->p_rlimit[RLIMIT_DATA].rlim_cur)
74 return(ENOMEM);
75 old = round_page(old + ctob(vm->vm_dsize));
76 diff = new - old;
77 if (diff > 0) {
78 if (swap_pager_full) {
79 return(ENOMEM);
80 }
75 rv = vm_allocate(&vm->vm_map, &old, diff, FALSE);
76 if (rv != KERN_SUCCESS) {
81 rv = vm_allocate(&vm->vm_map, &old, diff, FALSE);
82 if (rv != KERN_SUCCESS) {
77 uprintf("sbrk: grow failed, return = %d\n", rv);
78 return(ENOMEM);
79 }
80 vm->vm_dsize += btoc(diff);
81 } else if (diff < 0) {
82 diff = -diff;
83 rv = vm_deallocate(&vm->vm_map, new, diff);
84 if (rv != KERN_SUCCESS) {
83 return(ENOMEM);
84 }
85 vm->vm_dsize += btoc(diff);
86 } else if (diff < 0) {
87 diff = -diff;
88 rv = vm_deallocate(&vm->vm_map, new, diff);
89 if (rv != KERN_SUCCESS) {
85 uprintf("sbrk: shrink failed, return = %d\n", rv);
86 return(ENOMEM);
87 }
88 vm->vm_dsize -= btoc(diff);
89 }
90 return(0);
91}
92
90 return(ENOMEM);
91 }
92 vm->vm_dsize -= btoc(diff);
93 }
94 return(0);
95}
96
93/*
94 * Enlarge the "stack segment" to include the specified
95 * stack pointer for the process.
96 */
97int
98grow(p, sp)
99 struct proc *p;
100 unsigned sp;
101{
102 register struct vmspace *vm = p->p_vmspace;
103 register int si;
104
105 /*
106 * For user defined stacks (from sendsig).
107 */
108 if (sp < (unsigned)vm->vm_maxsaddr)
109 return (0);
110 /*
111 * For common case of already allocated (from trap).
112 */
113 if (sp >= USRSTACK - ctob(vm->vm_ssize))
114 return (1);
115 /*
116 * Really need to check vs limit and increment stack size if ok.
117 */
118 si = clrnd(btoc(USRSTACK-sp) - vm->vm_ssize);
119 if (vm->vm_ssize + si > btoc(p->p_rlimit[RLIMIT_STACK].rlim_cur))
120 return (0);
121 vm->vm_ssize += si;
122 return (1);
123}
124
125struct ovadvise_args {
126 int anom;
127};
97struct ovadvise_args {
98 int anom;
99};
100
128/* ARGSUSED */
129int
130ovadvise(p, uap, retval)
131 struct proc *p;
132 struct ovadvise_args *uap;
133 int *retval;
134{
135
136 return (EINVAL);
137}
101/* ARGSUSED */
102int
103ovadvise(p, uap, retval)
104 struct proc *p;
105 struct ovadvise_args *uap;
106 int *retval;
107{
108
109 return (EINVAL);
110}