aboutsummaryrefslogtreecommitdiff
path: root/sys/compat
diff options
context:
space:
mode:
authorEdward Tomasz Napierala <trasz@FreeBSD.org>2017-02-06 20:57:12 +0000
committerEdward Tomasz Napierala <trasz@FreeBSD.org>2017-02-06 20:57:12 +0000
commit69cdfcef2e54b11adef998de73a16931ff256ea4 (patch)
tree0e8dbb47a61f6d071186068cb5c59a7783a29e84 /sys/compat
parent1110d0029a6353a341008a1031cca85c7e34b50a (diff)
downloadsrc-69cdfcef2e54b11adef998de73a16931ff256ea4.tar.gz
src-69cdfcef2e54b11adef998de73a16931ff256ea4.zip
Add kern_vm_mmap2(), kern_vm_mprotect(), kern_vm_msync(), kern_vm_munlock(),
kern_vm_munmap(), and kern_vm_madvise(), and use them in various compats instead of their sys_*() counterparts. Reviewed by: ed, dchagin, kib MFC after: 2 weeks Sponsored by: DARPA, AFRL Differential Revision: https://reviews.freebsd.org/D9378
Notes
Notes: svn path=/head/; revision=313352
Diffstat (limited to 'sys/compat')
-rw-r--r--sys/compat/cloudabi/cloudabi_mem.c88
-rw-r--r--sys/compat/freebsd32/freebsd32_misc.c32
-rw-r--r--sys/compat/linux/linux_misc.c21
-rw-r--r--sys/compat/linux/linux_mmap.c60
4 files changed, 70 insertions, 131 deletions
diff --git a/sys/compat/cloudabi/cloudabi_mem.c b/sys/compat/cloudabi/cloudabi_mem.c
index 55685284fa9e..42234f9f99c5 100644
--- a/sys/compat/cloudabi/cloudabi_mem.c
+++ b/sys/compat/cloudabi/cloudabi_mem.c
@@ -28,7 +28,9 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/mman.h>
-#include <sys/sysproto.h>
+#include <sys/proc.h>
+
+#include <vm/vm_extern.h>
#include <contrib/cloudabi/cloudabi_types_common.h>
@@ -62,137 +64,115 @@ int
cloudabi_sys_mem_advise(struct thread *td,
struct cloudabi_sys_mem_advise_args *uap)
{
- struct madvise_args madvise_args = {
- .addr = uap->mapping,
- .len = uap->mapping_len
- };
+ int behav;
switch (uap->advice) {
case CLOUDABI_ADVICE_DONTNEED:
- madvise_args.behav = MADV_DONTNEED;
+ behav = MADV_DONTNEED;
break;
case CLOUDABI_ADVICE_NORMAL:
- madvise_args.behav = MADV_NORMAL;
+ behav = MADV_NORMAL;
break;
case CLOUDABI_ADVICE_RANDOM:
- madvise_args.behav = MADV_RANDOM;
+ behav = MADV_RANDOM;
break;
case CLOUDABI_ADVICE_SEQUENTIAL:
- madvise_args.behav = MADV_SEQUENTIAL;
+ behav = MADV_SEQUENTIAL;
break;
case CLOUDABI_ADVICE_WILLNEED:
- madvise_args.behav = MADV_WILLNEED;
+ behav = MADV_WILLNEED;
break;
default:
return (EINVAL);
}
- return (sys_madvise(td, &madvise_args));
+ return (kern_vm_madvise(td, (vm_offset_t)uap->mapping,
+ uap->mapping_len, behav));
}
int
cloudabi_sys_mem_lock(struct thread *td, struct cloudabi_sys_mem_lock_args *uap)
{
- struct mlock_args mlock_args = {
- .addr = uap->mapping,
- .len = uap->mapping_len
- };
- return (sys_mlock(td, &mlock_args));
+ return (vm_mlock(td->td_proc, td->td_ucred, uap->mapping,
+ uap->mapping_len));
}
int
cloudabi_sys_mem_map(struct thread *td, struct cloudabi_sys_mem_map_args *uap)
{
- struct mmap_args mmap_args = {
- .addr = uap->addr,
- .len = uap->len,
- .fd = uap->fd,
- .pos = uap->off
- };
- int error;
+ int error, flags, prot;
/* Translate flags. */
+ flags = 0;
if (uap->flags & CLOUDABI_MAP_ANON)
- mmap_args.flags |= MAP_ANON;
+ flags |= MAP_ANON;
if (uap->flags & CLOUDABI_MAP_FIXED)
- mmap_args.flags |= MAP_FIXED;
+ flags |= MAP_FIXED;
if (uap->flags & CLOUDABI_MAP_PRIVATE)
- mmap_args.flags |= MAP_PRIVATE;
+ flags |= MAP_PRIVATE;
if (uap->flags & CLOUDABI_MAP_SHARED)
- mmap_args.flags |= MAP_SHARED;
+ flags |= MAP_SHARED;
/* Translate protection. */
- error = convert_mprot(uap->prot, &mmap_args.prot);
+ error = convert_mprot(uap->prot, &prot);
if (error != 0)
return (error);
- return (sys_mmap(td, &mmap_args));
+ return (kern_vm_mmap(td, (vm_offset_t)uap->addr, uap->len, prot,
+ flags, uap->fd, uap->off));
}
int
cloudabi_sys_mem_protect(struct thread *td,
struct cloudabi_sys_mem_protect_args *uap)
{
- struct mprotect_args mprotect_args = {
- .addr = uap->mapping,
- .len = uap->mapping_len,
- };
- int error;
+ int error, prot;
/* Translate protection. */
- error = convert_mprot(uap->prot, &mprotect_args.prot);
+ error = convert_mprot(uap->prot, &prot);
if (error != 0)
return (error);
- return (sys_mprotect(td, &mprotect_args));
+ return (kern_vm_mprotect(td, (vm_offset_t)uap->mapping,
+ uap->mapping_len, prot));
}
int
cloudabi_sys_mem_sync(struct thread *td, struct cloudabi_sys_mem_sync_args *uap)
{
- struct msync_args msync_args = {
- .addr = uap->mapping,
- .len = uap->mapping_len,
- };
+ int flags;
/* Convert flags. */
switch (uap->flags & (CLOUDABI_MS_ASYNC | CLOUDABI_MS_SYNC)) {
case CLOUDABI_MS_ASYNC:
- msync_args.flags |= MS_ASYNC;
+ flags = MS_ASYNC;
break;
case CLOUDABI_MS_SYNC:
- msync_args.flags |= MS_SYNC;
+ flags = MS_SYNC;
break;
default:
return (EINVAL);
}
if ((uap->flags & CLOUDABI_MS_INVALIDATE) != 0)
- msync_args.flags |= MS_INVALIDATE;
+ flags |= MS_INVALIDATE;
- return (sys_msync(td, &msync_args));
+ return (kern_vm_msync(td, (vm_offset_t)uap->mapping,
+ uap->mapping_len, flags));
}
int
cloudabi_sys_mem_unlock(struct thread *td,
struct cloudabi_sys_mem_unlock_args *uap)
{
- struct munlock_args munlock_args = {
- .addr = uap->mapping,
- .len = uap->mapping_len
- };
- return (sys_munlock(td, &munlock_args));
+ return (kern_vm_munlock(td, (vm_offset_t)uap->mapping, uap->mapping_len));
}
int
cloudabi_sys_mem_unmap(struct thread *td,
struct cloudabi_sys_mem_unmap_args *uap)
{
- struct munmap_args munmap_args = {
- .addr = uap->mapping,
- .len = uap->mapping_len
- };
- return (sys_munmap(td, &munmap_args));
+ return (kern_vm_munmap(td, (vm_offset_t)uap->mapping, uap->mapping_len));
}
diff --git a/sys/compat/freebsd32/freebsd32_misc.c b/sys/compat/freebsd32/freebsd32_misc.c
index b105d03b44dd..d30c520b0e49 100644
--- a/sys/compat/freebsd32/freebsd32_misc.c
+++ b/sys/compat/freebsd32/freebsd32_misc.c
@@ -449,42 +449,30 @@ freebsd32_fexecve(struct thread *td, struct freebsd32_fexecve_args *uap)
int
freebsd32_mprotect(struct thread *td, struct freebsd32_mprotect_args *uap)
{
- struct mprotect_args ap;
+ int prot;
- ap.addr = PTRIN(uap->addr);
- ap.len = uap->len;
- ap.prot = uap->prot;
+ prot = uap->prot;
#if defined(__amd64__)
- if (i386_read_exec && (ap.prot & PROT_READ) != 0)
- ap.prot |= PROT_EXEC;
+ if (i386_read_exec && (prot & PROT_READ) != 0)
+ prot |= PROT_EXEC;
#endif
- return (sys_mprotect(td, &ap));
+ return (kern_vm_mprotect(td, (vm_offset_t)PTRIN(uap->addr),
+ uap->len, prot));
}
int
freebsd32_mmap(struct thread *td, struct freebsd32_mmap_args *uap)
{
- struct mmap_args ap;
- vm_offset_t addr = (vm_offset_t) uap->addr;
- vm_size_t len = uap->len;
- int prot = uap->prot;
- int flags = uap->flags;
- int fd = uap->fd;
- off_t pos = PAIR32TO64(off_t,uap->pos);
+ int prot;
+ prot = uap->prot;
#if defined(__amd64__)
if (i386_read_exec && (prot & PROT_READ))
prot |= PROT_EXEC;
#endif
- ap.addr = (void *) addr;
- ap.len = len;
- ap.prot = prot;
- ap.flags = flags;
- ap.fd = fd;
- ap.pos = pos;
-
- return (sys_mmap(td, &ap));
+ return (kern_vm_mmap(td, (vm_offset_t)uap->addr, uap->len, prot,
+ uap->flags, uap->fd, PAIR32TO64(off_t, uap->pos)));
}
#ifdef COMPAT_FREEBSD6
diff --git a/sys/compat/linux/linux_misc.c b/sys/compat/linux/linux_misc.c
index 139b902b20d7..b73e5d9146f8 100644
--- a/sys/compat/linux/linux_misc.c
+++ b/sys/compat/linux/linux_misc.c
@@ -585,10 +585,8 @@ select_out:
int
linux_mremap(struct thread *td, struct linux_mremap_args *args)
{
- struct munmap_args /* {
- void *addr;
- size_t len;
- } */ bsd_args;
+ uintptr_t addr;
+ size_t len;
int error = 0;
#ifdef DEBUG
@@ -623,10 +621,9 @@ linux_mremap(struct thread *td, struct linux_mremap_args *args)
}
if (args->new_len < args->old_len) {
- bsd_args.addr =
- (caddr_t)((uintptr_t)args->addr + args->new_len);
- bsd_args.len = args->old_len - args->new_len;
- error = sys_munmap(td, &bsd_args);
+ addr = args->addr + args->new_len;
+ len = args->old_len - args->new_len;
+ error = kern_vm_munmap(td, addr, len);
}
td->td_retval[0] = error ? 0 : (uintptr_t)args->addr;
@@ -640,13 +637,9 @@ linux_mremap(struct thread *td, struct linux_mremap_args *args)
int
linux_msync(struct thread *td, struct linux_msync_args *args)
{
- struct msync_args bsd_args;
- bsd_args.addr = (caddr_t)(uintptr_t)args->addr;
- bsd_args.len = (uintptr_t)args->len;
- bsd_args.flags = args->fl & ~LINUX_MS_SYNC;
-
- return (sys_msync(td, &bsd_args));
+ return (kern_vm_msync(td, args->addr, args->len,
+ args->fl & ~LINUX_MS_SYNC));
}
int
diff --git a/sys/compat/linux/linux_mmap.c b/sys/compat/linux/linux_mmap.c
index 870f0be418f6..0c3f7688db59 100644
--- a/sys/compat/linux/linux_mmap.c
+++ b/sys/compat/linux/linux_mmap.c
@@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$");
#include <sys/sysproto.h>
#include <vm/pmap.h>
+#include <vm/vm_extern.h>
#include <vm/vm_map.h>
#include <compat/linux/linux_emul.h>
@@ -67,15 +68,7 @@ linux_mmap_common(struct thread *td, uintptr_t addr, size_t len, int prot,
{
struct proc *p = td->td_proc;
struct vmspace *vms = td->td_proc->p_vmspace;
- struct mmap_args /* {
- caddr_t addr;
- size_t len;
- int prot;
- int flags;
- int fd;
- off_t pos;
- } */ bsd_args;
- int error;
+ int bsd_flags, error;
struct file *fp;
cap_rights_t rights;
@@ -83,7 +76,7 @@ linux_mmap_common(struct thread *td, uintptr_t addr, size_t len, int prot,
addr, len, prot, flags, fd, pos);
error = 0;
- bsd_args.flags = 0;
+ bsd_flags = 0;
fp = NULL;
/*
@@ -94,21 +87,21 @@ linux_mmap_common(struct thread *td, uintptr_t addr, size_t len, int prot,
return (EINVAL);
if (flags & LINUX_MAP_SHARED)
- bsd_args.flags |= MAP_SHARED;
+ bsd_flags |= MAP_SHARED;
if (flags & LINUX_MAP_PRIVATE)
- bsd_args.flags |= MAP_PRIVATE;
+ bsd_flags |= MAP_PRIVATE;
if (flags & LINUX_MAP_FIXED)
- bsd_args.flags |= MAP_FIXED;
+ bsd_flags |= MAP_FIXED;
if (flags & LINUX_MAP_ANON) {
/* Enforce pos to be on page boundary, then ignore. */
if ((pos & PAGE_MASK) != 0)
return (EINVAL);
pos = 0;
- bsd_args.flags |= MAP_ANON;
+ bsd_flags |= MAP_ANON;
} else
- bsd_args.flags |= MAP_NOSYNC;
+ bsd_flags |= MAP_NOSYNC;
if (flags & LINUX_MAP_GROWSDOWN)
- bsd_args.flags |= MAP_STACK;
+ bsd_flags |= MAP_STACK;
/*
* PROT_READ, PROT_WRITE, or PROT_EXEC implies PROT_READ and PROT_EXEC
@@ -118,14 +111,13 @@ linux_mmap_common(struct thread *td, uintptr_t addr, size_t len, int prot,
*
* XXX. Linux checks that the file system is not mounted with noexec.
*/
- bsd_args.prot = prot;
#if defined(__amd64__)
- linux_fixup_prot(td, &bsd_args.prot);
+ linux_fixup_prot(td, &prot);
#endif
/* Linux does not check file descriptor when MAP_ANONYMOUS is set. */
- bsd_args.fd = (bsd_args.flags & MAP_ANON) ? -1 : fd;
- if (bsd_args.fd != -1) {
+ fd = (bsd_flags & MAP_ANON) ? -1 : fd;
+ if (fd != -1) {
/*
* Linux follows Solaris mmap(2) description:
* The file descriptor fildes is opened with
@@ -133,8 +125,7 @@ linux_mmap_common(struct thread *td, uintptr_t addr, size_t len, int prot,
* protection options specified.
*/
- error = fget(td, bsd_args.fd,
- cap_rights_init(&rights, CAP_MMAP), &fp);
+ error = fget(td, fd, cap_rights_init(&rights, CAP_MMAP), &fp);
if (error != 0)
return (error);
if (fp->f_type != DTYPE_VNODE) {
@@ -205,21 +196,13 @@ linux_mmap_common(struct thread *td, uintptr_t addr, size_t len, int prot,
* we map the full stack, since we don't have a way
* to autogrow it.
*/
- if (len > STACK_SIZE - GUARD_SIZE) {
- bsd_args.addr = (caddr_t)addr;
- bsd_args.len = len;
- } else {
- bsd_args.addr = (caddr_t)addr -
- (STACK_SIZE - GUARD_SIZE - len);
- bsd_args.len = STACK_SIZE - GUARD_SIZE;
+ if (len <= STACK_SIZE - GUARD_SIZE) {
+ addr = addr - (STACK_SIZE - GUARD_SIZE - len);
+ len = STACK_SIZE - GUARD_SIZE;
}
- } else {
- bsd_args.addr = (caddr_t)addr;
- bsd_args.len = len;
}
- bsd_args.pos = pos;
- error = sys_mmap(td, &bsd_args);
+ error = kern_vm_mmap(td, addr, len, prot, bsd_flags, fd, pos);
LINUX_CTR2(mmap2, "return: %d (%p)", error, td->td_retval[0]);
@@ -229,16 +212,11 @@ linux_mmap_common(struct thread *td, uintptr_t addr, size_t len, int prot,
int
linux_mprotect_common(struct thread *td, uintptr_t addr, size_t len, int prot)
{
- struct mprotect_args bsd_args;
-
- bsd_args.addr = (void *)addr;
- bsd_args.len = len;
- bsd_args.prot = prot;
#if defined(__amd64__)
- linux_fixup_prot(td, &bsd_args.prot);
+ linux_fixup_prot(td, &prot);
#endif
- return (sys_mprotect(td, &bsd_args));
+ return (kern_vm_mprotect(td, addr, len, prot));
}
#if defined(__amd64__)