Home | History | Annotate | Line # | Download | only in common
vm_43.c revision 1.18.46.1
      1  1.18.46.1  pgoyette /*	$NetBSD: vm_43.c,v 1.18.46.1 2017/05/02 03:19:17 pgoyette Exp $	*/
      2        1.1  christos 
      3        1.1  christos /*
      4       1.18     rmind  * Copyright (c) 1988 University of Utah.
      5        1.1  christos  * Copyright (c) 1991, 1993
      6        1.1  christos  *	The Regents of the University of California.  All rights reserved.
      7        1.1  christos  *
      8        1.1  christos  * This code is derived from software contributed to Berkeley by
      9        1.1  christos  * the Systems Programming Group of the University of Utah Computer
     10        1.1  christos  * Science Department.
     11        1.1  christos  *
     12        1.1  christos  * Redistribution and use in source and binary forms, with or without
     13        1.1  christos  * modification, are permitted provided that the following conditions
     14        1.1  christos  * are met:
     15        1.1  christos  * 1. Redistributions of source code must retain the above copyright
     16        1.1  christos  *    notice, this list of conditions and the following disclaimer.
     17        1.1  christos  * 2. Redistributions in binary form must reproduce the above copyright
     18        1.1  christos  *    notice, this list of conditions and the following disclaimer in the
     19        1.1  christos  *    documentation and/or other materials provided with the distribution.
     20        1.9       agc  * 3. Neither the name of the University nor the names of its contributors
     21        1.9       agc  *    may be used to endorse or promote products derived from this software
     22        1.9       agc  *    without specific prior written permission.
     23        1.9       agc  *
     24        1.9       agc  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     25        1.9       agc  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     26        1.9       agc  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     27        1.9       agc  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     28        1.9       agc  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     29        1.9       agc  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     30        1.9       agc  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     31        1.9       agc  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     32        1.9       agc  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     33        1.9       agc  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     34        1.9       agc  * SUCH DAMAGE.
     35        1.9       agc  *
     36        1.9       agc  * from: Utah $Hdr: vm_mmap.c 1.6 91/10/21$
     37        1.9       agc  *
     38        1.9       agc  *	@(#)vm_mmap.c	8.5 (Berkeley) 5/19/94
     39        1.9       agc  */
     40        1.9       agc 
     41        1.9       agc /*
     42        1.1  christos  * Mapped file (mmap) interface to VM
     43        1.1  christos  */
     44        1.7     lukem 
     45        1.7     lukem #include <sys/cdefs.h>
     46  1.18.46.1  pgoyette __KERNEL_RCSID(0, "$NetBSD: vm_43.c,v 1.18.46.1 2017/05/02 03:19:17 pgoyette Exp $");
     47        1.1  christos 
     48        1.1  christos #include <sys/param.h>
     49        1.1  christos #include <sys/systm.h>
     50        1.1  christos #include <sys/filedesc.h>
     51        1.1  christos #include <sys/resourcevar.h>
     52        1.1  christos #include <sys/proc.h>
     53        1.1  christos #include <sys/vnode.h>
     54        1.1  christos #include <sys/file.h>
     55        1.1  christos #include <sys/mman.h>
     56        1.1  christos 
     57        1.1  christos #include <sys/syscallargs.h>
     58        1.1  christos 
     59        1.1  christos #include <miscfs/specfs/specdev.h>
     60        1.1  christos 
     61        1.1  christos /* ARGSUSED */
     62        1.1  christos int
     63       1.16       dsl compat_43_sys_getpagesize(struct lwp *l, const void *v, register_t *retval)
     64        1.1  christos {
     65        1.1  christos 
     66        1.1  christos 	*retval = PAGE_SIZE;
     67        1.1  christos 	return (0);
     68        1.1  christos }
     69        1.1  christos 
     70        1.1  christos int
     71       1.16       dsl compat_43_sys_mmap(struct lwp *l, const struct compat_43_sys_mmap_args *uap, register_t *retval)
     72        1.1  christos {
     73       1.16       dsl 	/* {
     74       1.15  christos 		syscallarg(void *) addr;
     75        1.1  christos 		syscallarg(size_t) len;
     76        1.1  christos 		syscallarg(int) prot;
     77        1.1  christos 		syscallarg(int) flags;
     78        1.1  christos 		syscallarg(int) fd;
     79        1.1  christos 		syscallarg(long) pos;
     80       1.16       dsl 	} */
     81        1.1  christos 	struct sys_mmap_args /* {
     82       1.15  christos 		syscallarg(void *) addr;
     83        1.1  christos 		syscallarg(size_t) len;
     84        1.1  christos 		syscallarg(int) prot;
     85        1.1  christos 		syscallarg(int) flags;
     86        1.1  christos 		syscallarg(int) fd;
     87        1.1  christos 		syscallarg(long) pad;
     88        1.1  christos 		syscallarg(off_t) pos;
     89        1.1  christos 	} */ nargs;
     90        1.1  christos 	static const char cvtbsdprot[8] = {
     91        1.1  christos 		0,
     92        1.1  christos 		PROT_EXEC,
     93        1.1  christos 		PROT_WRITE,
     94        1.1  christos 		PROT_EXEC|PROT_WRITE,
     95        1.1  christos 		PROT_READ,
     96        1.1  christos 		PROT_EXEC|PROT_READ,
     97        1.1  christos 		PROT_WRITE|PROT_READ,
     98        1.1  christos 		PROT_EXEC|PROT_WRITE|PROT_READ,
     99        1.1  christos 	};
    100        1.1  christos #define	OMAP_ANON	0x0002
    101        1.1  christos #define	OMAP_COPY	0x0020
    102        1.1  christos #define	OMAP_SHARED	0x0010
    103        1.1  christos #define	OMAP_FIXED	0x0100
    104        1.1  christos #define	OMAP_INHERIT	0x0800
    105        1.1  christos 
    106        1.1  christos 	SCARG(&nargs, addr) = SCARG(uap, addr);
    107        1.1  christos 	SCARG(&nargs, len) = SCARG(uap, len);
    108       1.10     david 	/* Note: index using prot is sign-safe due to mask */
    109        1.1  christos 	SCARG(&nargs, prot) = cvtbsdprot[SCARG(uap, prot)&0x7];
    110        1.1  christos 	SCARG(&nargs, flags) = 0;
    111        1.1  christos 	if (SCARG(uap, flags) & OMAP_ANON)
    112        1.1  christos 		SCARG(&nargs, flags) |= MAP_ANON;
    113        1.1  christos 	if (SCARG(uap, flags) & OMAP_SHARED)
    114        1.1  christos 		SCARG(&nargs, flags) |= MAP_SHARED;
    115        1.1  christos 	else
    116        1.1  christos 		SCARG(&nargs, flags) |= MAP_PRIVATE;
    117  1.18.46.1  pgoyette 	if (SCARG(uap, flags) & OMAP_COPY) {
    118  1.18.46.1  pgoyette 		SCARG(&nargs, flags) |= MAP_PRIVATE;
    119  1.18.46.1  pgoyette #if defined(COMPAT_10) && defined(__i386__)
    120  1.18.46.1  pgoyette 		/*
    121  1.18.46.1  pgoyette 		 * Ancient kernel on x86 did not obey PROT_EXEC on i386 at least
    122  1.18.46.1  pgoyette 		 * and ld.so did not turn it on. We take care of this on amd64
    123  1.18.46.1  pgoyette 		 * in compat32.
    124  1.18.46.1  pgoyette 		 */
    125  1.18.46.1  pgoyette 		SCARG(&nargs, prot) |= PROT_EXEC;
    126  1.18.46.1  pgoyette #endif
    127  1.18.46.1  pgoyette 	}
    128        1.1  christos 	if (SCARG(uap, flags) & OMAP_FIXED)
    129        1.1  christos 		SCARG(&nargs, flags) |= MAP_FIXED;
    130        1.1  christos 	if (SCARG(uap, flags) & OMAP_INHERIT)
    131        1.1  christos 		SCARG(&nargs, flags) |= MAP_INHERIT;
    132        1.1  christos 	SCARG(&nargs, fd) = SCARG(uap, fd);
    133        1.1  christos 	SCARG(&nargs, pos) = SCARG(uap, pos);
    134        1.8   thorpej 	return (sys_mmap(l, &nargs, retval));
    135        1.1  christos }
    136