vm_mmap.c (84783) | vm_mmap.c (89306) |
---|---|
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. --- 24 unchanged lines hidden (view full) --- 33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36 * SUCH DAMAGE. 37 * 38 * from: Utah $Hdr: vm_mmap.c 1.6 91/10/21$ 39 * 40 * @(#)vm_mmap.c 8.4 (Berkeley) 1/12/94 | 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. --- 24 unchanged lines hidden (view full) --- 33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36 * SUCH DAMAGE. 37 * 38 * from: Utah $Hdr: vm_mmap.c 1.6 91/10/21$ 39 * 40 * @(#)vm_mmap.c 8.4 (Berkeley) 1/12/94 |
41 * $FreeBSD: head/sys/vm/vm_mmap.c 84783 2001-10-10 23:06:54Z ps $ | 41 * $FreeBSD: head/sys/vm/vm_mmap.c 89306 2002-01-13 11:58:06Z alfred $ |
42 */ 43 44/* 45 * Mapped file (mmap) interface to VM 46 */ 47 48#include "opt_bleed.h" 49#include "opt_compat.h" --- 144 unchanged lines hidden (view full) --- 194/* 195 * MPSAFE 196 */ 197int 198mmap(td, uap) 199 struct thread *td; 200 struct mmap_args *uap; 201{ | 42 */ 43 44/* 45 * Mapped file (mmap) interface to VM 46 */ 47 48#include "opt_bleed.h" 49#include "opt_compat.h" --- 144 unchanged lines hidden (view full) --- 194/* 195 * MPSAFE 196 */ 197int 198mmap(td, uap) 199 struct thread *td; 200 struct mmap_args *uap; 201{ |
202 struct filedesc *fdp = td->td_proc->p_fd; | |
203 struct file *fp = NULL; 204 struct vnode *vp; 205 vm_offset_t addr; 206 vm_size_t size, pageoff; 207 vm_prot_t prot, maxprot; 208 void *handle; 209 int flags, error; 210 int disablexworkaround; 211 off_t pos; 212 struct vmspace *vms = td->td_proc->p_vmspace; 213 vm_object_t obj; 214 215 addr = (vm_offset_t) uap->addr; 216 size = uap->len; 217 prot = uap->prot & VM_PROT_ALL; 218 flags = uap->flags; 219 pos = uap->pos; 220 | 202 struct file *fp = NULL; 203 struct vnode *vp; 204 vm_offset_t addr; 205 vm_size_t size, pageoff; 206 vm_prot_t prot, maxprot; 207 void *handle; 208 int flags, error; 209 int disablexworkaround; 210 off_t pos; 211 struct vmspace *vms = td->td_proc->p_vmspace; 212 vm_object_t obj; 213 214 addr = (vm_offset_t) uap->addr; 215 size = uap->len; 216 prot = uap->prot & VM_PROT_ALL; 217 flags = uap->flags; 218 pos = uap->pos; 219 |
220 fp = NULL; |
|
221 /* make sure mapping fits into numeric range etc */ 222 if ((ssize_t) uap->len < 0 || 223 ((flags & MAP_ANON) && uap->fd != -1)) 224 return (EINVAL); 225 226 if (flags & MAP_STACK) { 227 if ((uap->fd != -1) || 228 ((prot & (PROT_READ | PROT_WRITE)) != (PROT_READ | PROT_WRITE))) --- 56 unchanged lines hidden (view full) --- 285 */ 286 handle = NULL; 287 maxprot = VM_PROT_ALL; 288 pos = 0; 289 } else { 290 /* 291 * Mapping file, get fp for validation. Obtain vnode and make 292 * sure it is of appropriate type. | 221 /* make sure mapping fits into numeric range etc */ 222 if ((ssize_t) uap->len < 0 || 223 ((flags & MAP_ANON) && uap->fd != -1)) 224 return (EINVAL); 225 226 if (flags & MAP_STACK) { 227 if ((uap->fd != -1) || 228 ((prot & (PROT_READ | PROT_WRITE)) != (PROT_READ | PROT_WRITE))) --- 56 unchanged lines hidden (view full) --- 285 */ 286 handle = NULL; 287 maxprot = VM_PROT_ALL; 288 pos = 0; 289 } else { 290 /* 291 * Mapping file, get fp for validation. Obtain vnode and make 292 * sure it is of appropriate type. |
293 * don't let the descriptor disappear on us if we block |
|
293 */ | 294 */ |
294 if (((unsigned) uap->fd) >= fdp->fd_nfiles || 295 (fp = fdp->fd_ofiles[uap->fd]) == NULL) { | 295 fp = ffind_hold(td, uap->fd); 296 if (fp == NULL) { |
296 error = EBADF; | 297 error = EBADF; |
297 goto done2; | 298 goto done; |
298 } 299 if (fp->f_type != DTYPE_VNODE) { 300 error = EINVAL; | 299 } 300 if (fp->f_type != DTYPE_VNODE) { 301 error = EINVAL; |
301 goto done2; | 302 goto done; |
302 } 303 304 /* | 303 } 304 305 /* |
305 * don't let the descriptor disappear on us if we block 306 */ 307 fhold(fp); 308 309 /* | |
310 * POSIX shared-memory objects are defined to have 311 * kernel persistence, and are not defined to support 312 * read(2)/write(2) -- or even open(2). Thus, we can 313 * use MAP_ASYNC to trade on-disk coherence for speed. 314 * The shm_open(3) library routine turns on the FPOSIXSHM 315 * flag to request this behavior. 316 */ 317 if (fp->f_flag & FPOSIXSHM) --- 114 unchanged lines hidden (view full) --- 432 error = vm_mmap(&vms->vm_map, &addr, size, prot, maxprot, 433 flags, handle, pos); 434 if (error == 0) 435 td->td_retval[0] = (register_t) (addr + pageoff); 436 mtx_lock(&Giant); 437done: 438 if (fp) 439 fdrop(fp, td); | 306 * POSIX shared-memory objects are defined to have 307 * kernel persistence, and are not defined to support 308 * read(2)/write(2) -- or even open(2). Thus, we can 309 * use MAP_ASYNC to trade on-disk coherence for speed. 310 * The shm_open(3) library routine turns on the FPOSIXSHM 311 * flag to request this behavior. 312 */ 313 if (fp->f_flag & FPOSIXSHM) --- 114 unchanged lines hidden (view full) --- 428 error = vm_mmap(&vms->vm_map, &addr, size, prot, maxprot, 429 flags, handle, pos); 430 if (error == 0) 431 td->td_retval[0] = (register_t) (addr + pageoff); 432 mtx_lock(&Giant); 433done: 434 if (fp) 435 fdrop(fp, td); |
440done2: | |
441 mtx_unlock(&Giant); 442 return (error); 443} 444 445#ifdef COMPAT_43 446#ifndef _SYS_SYSPROTO_H_ 447struct ommap_args { 448 caddr_t addr; --- 188 unchanged lines hidden (view full) --- 637void 638munmapfd(td, fd) 639 struct thread *td; 640 int fd; 641{ 642 /* 643 * XXX should unmap any regions mapped to this file 644 */ | 436 mtx_unlock(&Giant); 437 return (error); 438} 439 440#ifdef COMPAT_43 441#ifndef _SYS_SYSPROTO_H_ 442struct ommap_args { 443 caddr_t addr; --- 188 unchanged lines hidden (view full) --- 632void 633munmapfd(td, fd) 634 struct thread *td; 635 int fd; 636{ 637 /* 638 * XXX should unmap any regions mapped to this file 639 */ |
640 FILEDESC_LOCK(p->p_fd); |
|
645 td->td_proc->p_fd->fd_ofileflags[fd] &= ~UF_MAPPED; | 641 td->td_proc->p_fd->fd_ofileflags[fd] &= ~UF_MAPPED; |
642 FILEDESC_UNLOCK(p->p_fd); |
|
646} 647#endif 648 649#ifndef _SYS_SYSPROTO_H_ 650struct mprotect_args { 651 const void *addr; 652 size_t len; 653 int prot; --- 631 unchanged lines hidden --- | 643} 644#endif 645 646#ifndef _SYS_SYSPROTO_H_ 647struct mprotect_args { 648 const void *addr; 649 size_t len; 650 int prot; --- 631 unchanged lines hidden --- |