--- //depot/vendor/freebsd/src/sys/alpha/osf1/imgact_osf1.c 2005/01/29 23:15:43 +++ //depot/user/jhb/acpipci/alpha/osf1/imgact_osf1.c 2005/02/28 15:05:42 @@ -189,14 +189,14 @@ /* set up text segment */ if ((error = vm_mmap(&vmspace->vm_map, &taddr, tsize, VM_PROT_READ|VM_PROT_EXECUTE, VM_PROT_ALL, MAP_FIXED|MAP_COPY, - (caddr_t)imgp->vp, ECOFF_TXTOFF(execp)))) { + OBJT_VNODE, imgp->vp, ECOFF_TXTOFF(execp)))) { DPRINTF(("%s(%d): error = %d\n", __FILE__, __LINE__, error)); goto bail; } /* .. data .. */ if ((error = vm_mmap(&vmspace->vm_map, &daddr, dsize, VM_PROT_READ|VM_PROT_EXECUTE|VM_PROT_WRITE, VM_PROT_ALL, - MAP_FIXED|MAP_COPY, (caddr_t)imgp->vp, ECOFF_DATOFF(execp)))) { + MAP_FIXED|MAP_COPY, OBJT_VNODE, imgp->vp, ECOFF_DATOFF(execp)))) { DPRINTF(("%s(%d): error = %d\n", __FILE__, __LINE__, error)); goto bail; } --- //depot/vendor/freebsd/src/sys/alpha/osf1/osf1_misc.c 2005/02/18 18:40:30 +++ //depot/user/jhb/acpipci/alpha/osf1/osf1_misc.c 2005/02/28 15:05:42 @@ -1481,7 +1481,8 @@ if (uap->mask & OSF1_USW_NULLP) { rv = vm_mmap(&(p->p_vmspace->vm_map), &zero, PAGE_SIZE, VM_PROT_READ, VM_PROT_ALL, - MAP_PRIVATE | MAP_FIXED | MAP_ANON, NULL, 0); + MAP_PRIVATE | MAP_FIXED | MAP_ANON, OBJT_DEFAULT, + NULL, 0); if (!rv) return(KERN_SUCCESS); else { --- //depot/vendor/freebsd/src/sys/compat/linux/linux_misc.c 2005/02/07 18:37:08 +++ //depot/user/jhb/acpipci/compat/linux/linux_misc.c 2005/02/28 15:05:42 @@ -331,7 +331,7 @@ /* Pull in executable header into kernel_map */ error = vm_mmap(kernel_map, (vm_offset_t *)&a_out, PAGE_SIZE, - VM_PROT_READ, VM_PROT_READ, 0, (caddr_t)vp, 0); + VM_PROT_READ, VM_PROT_READ, 0, OBJT_VNODE, vp, 0); /* * Lock no longer needed */ @@ -420,7 +420,7 @@ /* map file into kernel_map */ error = vm_mmap(kernel_map, &buffer, round_page(a_out->a_text + a_out->a_data + file_offset), - VM_PROT_READ, VM_PROT_READ, 0, (caddr_t)vp, + VM_PROT_READ, VM_PROT_READ, 0, OBJT_VNODE, vp, trunc_page(file_offset)); if (error) goto cleanup; @@ -451,7 +451,7 @@ */ error = vm_mmap(&td->td_proc->p_vmspace->vm_map, &vmaddr, a_out->a_text + a_out->a_data, VM_PROT_ALL, VM_PROT_ALL, - MAP_PRIVATE | MAP_FIXED, (caddr_t)vp, file_offset); + MAP_PRIVATE | MAP_FIXED, OBJT_VNODE, vp, file_offset); if (error) goto cleanup; } --- //depot/vendor/freebsd/src/sys/compat/svr4/imgact_svr4.c 2005/01/29 23:15:43 +++ //depot/user/jhb/acpipci/compat/svr4/imgact_svr4.c 2005/02/28 15:05:42 @@ -145,7 +145,7 @@ error = vm_mmap(kernel_map, &buffer, round_page(a_out->a_text + a_out->a_data + file_offset), VM_PROT_READ, VM_PROT_READ, 0, - (caddr_t) imgp->vp, trunc_page(file_offset)); + OBJT_VNODE, imgp->vp, trunc_page(file_offset)); if (error) goto fail; @@ -182,7 +182,7 @@ VM_PROT_READ | VM_PROT_EXECUTE, VM_PROT_ALL, MAP_PRIVATE | MAP_FIXED, - (caddr_t)imgp->vp, file_offset); + OBJT_VNODE, imgp->vp, file_offset); if (error) goto fail; --- //depot/vendor/freebsd/src/sys/dev/drm/drm_bufs.h 2005/02/22 14:00:48 +++ //depot/user/jhb/acpipci/dev/drm/drm_bufs.h 2005/02/28 15:05:42 @@ -923,12 +923,8 @@ #ifdef __FreeBSD__ vaddr = round_page((vm_offset_t)vms->vm_daddr + MAXDSIZ); -#ifdef this_is_just_plain_bogus retcode = vm_mmap(&vms->vm_map, &vaddr, size, PROT_READ | PROT_WRITE, - VM_PROT_ALL, MAP_SHARED, SLIST_FIRST(&kdev->si_hlist), foff ); -#else - retcode = EOPNOTSUPP; -#endif + VM_PROT_ALL, MAP_SHARED, OBJT_DEVICE, kdev, foff ); #elif defined(__NetBSD__) vaddr = round_page((vaddr_t)vms->vm_daddr + MAXDSIZ); retcode = uvm_mmap(&vms->vm_map, &vaddr, size, --- //depot/vendor/freebsd/src/sys/i386/ibcs2/imgact_coff.c 2005/01/29 23:15:43 +++ //depot/user/jhb/acpipci/i386/ibcs2/imgact_coff.c 2005/02/28 15:05:42 @@ -91,7 +91,7 @@ } DPRINTF(("%s(%d): vm_mmap(&vmspace->vm_map, &0x%08lx, 0x%x, 0x%x, " - "VM_PROT_ALL, MAP_PRIVATE | MAP_FIXED, vp, 0x%x)\n", + "VM_PROT_ALL, MAP_PRIVATE | MAP_FIXED, OBJT_VNODE, vp, 0x%x)\n", __FILE__, __LINE__, map_addr, map_len, prot, map_offset)); if ((error = vm_mmap(&vmspace->vm_map, @@ -100,7 +100,8 @@ prot, VM_PROT_ALL, MAP_PRIVATE | MAP_FIXED, - (caddr_t) vp, + OBJT_VNODE, + vp, map_offset)) != 0) return error; @@ -136,7 +137,8 @@ VM_PROT_READ, VM_PROT_READ, 0, - (caddr_t) vp, + OBJT_VNODE, + vp, trunc_page(offset + filsz))) != 0) return error; @@ -215,7 +217,8 @@ VM_PROT_READ, VM_PROT_READ, 0, - (caddr_t) vp, + OBJT_VNODE, + vp, 0)) != 0) goto unlocked_fail; @@ -372,7 +375,8 @@ VM_PROT_READ, VM_PROT_READ, 0, - (caddr_t) imgp->vp, + OBJT_VNODE, + imgp->vp, foff)) != 0) { error = ENOEXEC; goto fail; --- //depot/vendor/freebsd/src/sys/i386/linux/imgact_linux.c 2005/01/29 23:15:43 +++ //depot/user/jhb/acpipci/i386/linux/imgact_linux.c 2005/02/28 15:05:42 @@ -143,8 +143,8 @@ error = vm_mmap(kernel_map, &buffer, round_page(a_out->a_text + a_out->a_data + file_offset), - VM_PROT_READ, VM_PROT_READ, 0, - (caddr_t) imgp->vp, trunc_page(file_offset)); + VM_PROT_READ, VM_PROT_READ, 0, OBJT_VNODE, + imgp->vp, trunc_page(file_offset)); if (error) goto fail; @@ -181,7 +181,8 @@ VM_PROT_READ | VM_PROT_EXECUTE, VM_PROT_ALL, MAP_PRIVATE | MAP_FIXED, - (caddr_t)imgp->vp, file_offset); + OBJT_VNODE, + imgp->vp, file_offset); if (error) goto fail; --- //depot/vendor/freebsd/src/sys/kern/imgact_gzip.c 2005/01/29 23:15:43 +++ //depot/user/jhb/acpipci/kern/imgact_gzip.c 2005/02/28 15:05:42 @@ -238,7 +238,8 @@ &vmaddr, gz->a_out.a_text + gz->a_out.a_data, VM_PROT_ALL, VM_PROT_ALL, MAP_ANON | MAP_FIXED, - 0, + OBJT_DEFAULT, + NULL, 0); if (error) { @@ -311,7 +312,8 @@ VM_PROT_READ, /* protection */ VM_PROT_READ, /* max protection */ 0, /* flags */ - (caddr_t) igz->ip->vp, /* vnode */ + OBJT_VNODE, /* handle type */ + igz->ip->vp, /* vnode */ igz->offset); /* offset */ if (error) { igz->where = __LINE__; --- //depot/vendor/freebsd/src/sys/vm/vm.h 2005/01/07 02:32:16 +++ //depot/user/jhb/acpipci/vm/vm.h 2005/03/03 21:10:11 @@ -80,6 +80,10 @@ #define VM_PROT_RW (VM_PROT_READ|VM_PROT_WRITE) #define VM_PROT_DEFAULT VM_PROT_ALL +enum obj_type { OBJT_DEFAULT, OBJT_SWAP, OBJT_VNODE, OBJT_DEVICE, OBJT_PHYS, + OBJT_DEAD }; +typedef u_char objtype_t; + union vm_map_object; typedef union vm_map_object vm_map_object_t; --- //depot/vendor/freebsd/src/sys/vm/vm_extern.h 2004/11/20 02:31:01 +++ //depot/user/jhb/acpipci/vm/vm_extern.h 2005/02/28 15:05:42 @@ -72,7 +72,7 @@ int vm_fault_wire(vm_map_t, vm_offset_t, vm_offset_t, boolean_t, boolean_t); void vm_forkproc(struct thread *, struct proc *, struct thread *, int); void vm_waitproc(struct proc *); -int vm_mmap(vm_map_t, vm_offset_t *, vm_size_t, vm_prot_t, vm_prot_t, int, void *, vm_ooffset_t); +int vm_mmap(vm_map_t, vm_offset_t *, vm_size_t, vm_prot_t, vm_prot_t, int, objtype_t, void *, vm_ooffset_t); void vm_set_page_size(void); struct vmspace *vmspace_alloc(vm_offset_t, vm_offset_t); struct vmspace *vmspace_fork(struct vmspace *); --- //depot/vendor/freebsd/src/sys/vm/vm_mmap.c 2005/01/25 00:40:30 +++ //depot/user/jhb/acpipci/vm/vm_mmap.c 2005/03/03 21:10:11 @@ -109,6 +109,8 @@ static int vm_mmap_vnode(struct thread *, vm_size_t, vm_prot_t, vm_prot_t *, int *, struct vnode *, vm_ooffset_t, vm_object_t *); +static int vm_mmap_cdev(struct thread *, vm_size_t, vm_prot_t, vm_prot_t *, + int *, struct cdev *, vm_ooffset_t, vm_object_t *); /* * MPSAFE @@ -205,6 +207,7 @@ vm_size_t size, pageoff; vm_prot_t prot, maxprot; void *handle; + objtype_t handle_type; int flags, error; off_t pos; struct vmspace *vms = td->td_proc->p_vmspace; @@ -282,6 +285,7 @@ * Mapping blank space is trivial. */ handle = NULL; + handle_type = OBJT_DEFAULT; maxprot = VM_PROT_ALL; pos = 0; } else { @@ -344,6 +348,7 @@ maxprot |= VM_PROT_WRITE; } handle = (void *)vp; + handle_type = OBJT_VNODE; } /* @@ -358,7 +363,7 @@ } error = vm_mmap(&vms->vm_map, &addr, size, prot, maxprot, - flags, handle, pos); + flags, handle_type, handle, pos); if (error == 0) td->td_retval[0] = (register_t) (addr + pageoff); done: @@ -1166,6 +1171,55 @@ } /* + * vm_mmap_cdev() + * + * MPSAFE + * + * Helper function for vm_mmap. Perform sanity check specific for mmap + * operations on cdevs. + */ +int +vm_mmap_cdev(struct thread *td, vm_size_t objsize, + vm_prot_t prot, vm_prot_t *maxprotp, int *flagsp, + struct cdev *cdev, vm_ooffset_t foff, vm_object_t *objp) +{ + vm_object_t obj; + int flags; + + flags = *flagsp; + + /* XXX: lack thredref on device */ + if (cdev->si_devsw->d_flags & D_MMAP_ANON) { + *maxprotp = VM_PROT_ALL; + *flagsp |= MAP_ANON; + return (0); + } + /* + * cdevs does not provide private mappings of any kind. + */ + if ((*maxprotp & VM_PROT_WRITE) == 0 && + (prot & PROT_WRITE) != 0) + return (EACCES); + if (flags & (MAP_PRIVATE|MAP_COPY)) + return (EINVAL); + /* + * Force device mappings to be shared. + */ + flags |= MAP_SHARED; +#ifdef MAC_XXX + error = mac_check_cdev_mmap(td->td_ucred, cdev, prot); + if (error != 0) + return (error); +#endif + obj = vm_pager_allocate(OBJT_DEVICE, cdev, objsize, prot, foff); + if (obj == NULL) + return (EINVAL); + *objp = obj; + *flagsp = flags; + return (0); +} + +/* * vm_mmap() * * MPSAFE @@ -1176,7 +1230,7 @@ int vm_mmap(vm_map_t map, vm_offset_t *addr, vm_size_t size, vm_prot_t prot, vm_prot_t maxprot, int flags, - void *handle, + objtype_t handle_type, void *handle, vm_ooffset_t foff) { boolean_t fitit; @@ -1222,13 +1276,26 @@ /* * Lookup/allocate object. */ - if (handle != NULL) { + switch (handle_type) { + case OBJT_DEVICE: + error = vm_mmap_cdev(td, size, prot, &maxprot, &flags, + handle, foff, &object); + break; + case OBJT_VNODE: error = vm_mmap_vnode(td, size, prot, &maxprot, &flags, handle, foff, &object); - if (error) { - return (error); + break; + case OBJT_DEFAULT: + if (handle == NULL) { + error = 0; + break; } + /* FALLTHROUGH */ + default: + error = EINVAL; } + if (error) + return (error); if (flags & MAP_ANON) { object = NULL; docow = 0; --- //depot/vendor/freebsd/src/sys/vm/vm_object.h 2005/01/07 02:32:16 +++ //depot/user/jhb/acpipci/vm/vm_object.h 2005/03/03 21:10:11 @@ -71,10 +71,6 @@ #include #include -enum obj_type { OBJT_DEFAULT, OBJT_SWAP, OBJT_VNODE, OBJT_DEVICE, OBJT_PHYS, - OBJT_DEAD }; -typedef u_char objtype_t; - /* * Types defined: *