Module Name: src Committed By: riastradh Date: Wed Jul 24 02:04:31 UTC 2013
Modified Files: src/sys/external/bsd/drm2/include/linux [riastradh-drm2]: mm.h Log Message: First stab at vm_mmap in <linux/mm.h>. Also PAGE_SIZE & round_page. To generate a diff of this commit: cvs rdiff -u -r1.1.2.1 -r1.1.2.2 src/sys/external/bsd/drm2/include/linux/mm.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/external/bsd/drm2/include/linux/mm.h diff -u src/sys/external/bsd/drm2/include/linux/mm.h:1.1.2.1 src/sys/external/bsd/drm2/include/linux/mm.h:1.1.2.2 --- src/sys/external/bsd/drm2/include/linux/mm.h:1.1.2.1 Wed Jul 24 00:33:12 2013 +++ src/sys/external/bsd/drm2/include/linux/mm.h Wed Jul 24 02:04:31 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: mm.h,v 1.1.2.1 2013/07/24 00:33:12 riastradh Exp $ */ +/* $NetBSD: mm.h,v 1.1.2.2 2013/07/24 02:04:31 riastradh Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -32,4 +32,79 @@ #ifndef _LINUX_MM_H_ #define _LINUX_MM_H_ +#include <sys/kauth.h> +#include <sys/file.h> +#include <sys/mman.h> +#include <sys/proc.h> +#include <sys/vnode.h> + +#include <uvm/uvm_extern.h> + +#define PAGE_ALIGN(x) round_page(x) + +/* + * ################################################################### + * ############### XXX THIS NEEDS SERIOUS SCRUTINY XXX ############### + * ################################################################### + */ + +/* + * XXX unsigned long is a loser but will probably work accidentally. + * XXX struct file might not map quite right between Linux and NetBSD. + * XXX This is large enough it should take its own file. + */ + +static inline unsigned long +vm_mmap(struct file *file, unsigned long base, unsigned long size, + unsigned long prot, unsigned long flags, unsigned long token) +{ + struct vnode *vnode; + vaddr_t addr = 0; + int error; + + /* + * Cargo-culted from sys_mmap. Various conditions kasserted + * rather than checked for expedience and safey. + */ + + KASSERT(base == 0); + KASSERT(prot == (PROT_READ | PROT_WRITE)); + KASSERT(flags == MAP_SHARED); + + KASSERT(file->f_type == DTYPE_VNODE); + vnode = file->f_data; + + KASSERT(vnode->v_type == VCHR); + KASSERT((file->f_flag & (FREAD | FWRITE)) == (FREAD | FWRITE)); + + { + struct vattr va; + + vn_lock(vnode, (LK_SHARED | LK_RETRY)); + error = VOP_GETATTR(vnode, &va, kauth_cred_get()); + VOP_UNLOCK(vnode); + if (error) + goto out; + /* XXX kassert? */ + if ((va.va_flags & (SF_SNAPSHOT | IMMUTABLE | APPEND)) != 0) { + error = EACCES; + goto out; + } + } + + /* XXX pax_mprotect? pax_aslr? */ + + error = uvm_mmap(&curproc->p_vmspace->vm_map, &addr, size, + (VM_PROT_READ | VM_PROT_WRITE), (VM_PROT_READ | VM_PROT_WRITE), + MAP_SHARED, vnode, base, + curproc->p_rlimit[RLIMIT_MEMLOCK].rlim_cur); + if (error) + goto out; + + KASSERT(addr <= -1024UL); /* XXX Kludgerosity! */ + +out: /* XXX errno NetBSD->Linux (kludgerific) */ + return (error? (-error) : (unsigned long)addr); +} + #endif /* _LINUX_MM_H_ */