Exemple #1
0
int
vmcmd_map_pagedvn(struct lwp *l, struct exec_vmcmd *cmd)
{
	struct uvm_object *uobj;
	struct vnode *vp = cmd->ev_vp;
	struct proc *p = l->l_proc;
	int error;
	vm_prot_t prot, maxprot;

	KASSERT(vp->v_iflag & VI_TEXT);

	/*
	 * map the vnode in using uvm_map.
	 */

        if (cmd->ev_len == 0)
                return(0);
        if (cmd->ev_offset & PAGE_MASK)
                return(EINVAL);
	if (cmd->ev_addr & PAGE_MASK)
		return(EINVAL);
	if (cmd->ev_len & PAGE_MASK)
		return(EINVAL);

	prot = cmd->ev_prot;
	maxprot = UVM_PROT_ALL;
#ifdef PAX_MPROTECT
	pax_mprotect(l, &prot, &maxprot);
#endif /* PAX_MPROTECT */

	/*
	 * check the file system's opinion about mmapping the file
	 */

	error = VOP_MMAP(vp, prot, l->l_cred);
	if (error)
		return error;

	if ((vp->v_vflag & VV_MAPPED) == 0) {
		vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
		vp->v_vflag |= VV_MAPPED;
		VOP_UNLOCK(vp, 0);
	}

	/*
	 * do the map, reference the object for this map entry
	 */
	uobj = &vp->v_uobj;
	vref(vp);

	error = uvm_map(&p->p_vmspace->vm_map, &cmd->ev_addr, cmd->ev_len,
		uobj, cmd->ev_offset, 0,
		UVM_MAPFLAG(prot, maxprot, UVM_INH_COPY,
			UVM_ADV_NORMAL, UVM_FLAG_COPYONW|UVM_FLAG_FIXED));
	if (error) {
		uobj->pgops->pgo_detach(uobj);
	}
	return error;
}
Exemple #2
0
static int
unionfs_mmap(void *v)
{
	struct vop_mmap_args *ap = v;
	struct unionfs_node *unp;
	struct vnode   *tvp;

	unp = VTOUNIONFS(ap->a_vp);
	tvp = (unp->un_uppervp != NULLVP ? unp->un_uppervp : unp->un_lowervp);

	return VOP_MMAP(tvp, ap->a_prot, ap->a_cred);
}
Exemple #3
0
int
RUMP_VOP_MMAP(struct vnode *vp,
    int prot,
    struct kauth_cred *cred)
{
	int error;

	rump_schedule();
	error = VOP_MMAP(vp, prot, cred);
	rump_unschedule();

	return error;
}
Exemple #4
0
int
vnode_fop_mmap(
    FILE_T *fp,
    struct vm_area_struct *mem_p
)
{
    INODE_T *ip = fp->f_dentry->d_inode;
    int err = 0;
    loff_t len;
    loff_t offset = mem_p->vm_pgoff << PAGE_CACHE_SHIFT;
    loff_t maxoffset = MVFS_MAXOFF_T;
    VNODE_T *vp;
    struct mmap_ctx ctx;
    CALL_DATA_T cd;

    /* make sure offset, len are within our range */

    if (!(fp->f_flags & O_LARGEFILE))
        maxoffset = MAX_NON_LFS;

    len = mem_p->vm_end - mem_p->vm_start;

    if (offset < 0)
        return -EINVAL;

    if (offset >= maxoffset ||
        (offset + len) < 0 ||
        (offset + len) >= maxoffset)
    {
        return -EOVERFLOW;                 
    }

    ASSERT(MDKI_INOISMVFS(ip));
    vp = ITOV(ip);
    if (vp->v_type != VREG)
        return -ENODEV;

    ctx.file = fp;
    ctx.mem = mem_p;
    mdki_linux_init_call_data(&cd);
    err = VOP_MMAP(vp, vma_to_sharing(mem_p),
                   vma_to_rwx(mem_p),
                   &cd, &ctx);
    mdki_linux_destroy_call_data(&cd);

    MDKI_TRACE(TRACE_MAP, "vp=%p mflags=%x prot=%x error=%d\n",
              vp, vma_to_sharing(mem_p),
              vma_to_rwx(mem_p), err);
    return mdki_errno_unix_to_linux(err);
}