From owner-svn-src-all@freebsd.org Fri Jul 17 09:00:40 2015 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 2739A9966D1; Fri, 17 Jul 2015 09:00:40 +0000 (UTC) (envelope-from ed@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 073A2125F; Fri, 17 Jul 2015 09:00:40 +0000 (UTC) (envelope-from ed@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.70]) by repo.freebsd.org (8.14.9/8.14.9) with ESMTP id t6H90dG6085542; Fri, 17 Jul 2015 09:00:39 GMT (envelope-from ed@FreeBSD.org) Received: (from ed@localhost) by repo.freebsd.org (8.14.9/8.14.9/Submit) id t6H90dJU085538; Fri, 17 Jul 2015 09:00:39 GMT (envelope-from ed@FreeBSD.org) Message-Id: <201507170900.t6H90dJU085538@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: ed set sender to ed@FreeBSD.org using -f From: Ed Schouten Date: Fri, 17 Jul 2015 09:00:39 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r285652 - in head/sys: compat/cloudabi contrib/cloudabi X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 17 Jul 2015 09:00:40 -0000 Author: ed Date: Fri Jul 17 09:00:38 2015 New Revision: 285652 URL: https://svnweb.freebsd.org/changeset/base/285652 Log: Implement CloudABI memory management system calls. Add support for the functions by wrapping around our own implementations. There are no kern_*() variants of these system calls, but we also don't need them in this case. It is sufficient to just call into the sys_*() functions. Differential Revision: https://reviews.freebsd.org/D3033 Reviewed by: brooks Modified: head/sys/compat/cloudabi/cloudabi_mem.c head/sys/contrib/cloudabi/syscalldefs_mi.h Modified: head/sys/compat/cloudabi/cloudabi_mem.c ============================================================================== --- head/sys/compat/cloudabi/cloudabi_mem.c Fri Jul 17 08:37:13 2015 (r285651) +++ head/sys/compat/cloudabi/cloudabi_mem.c Fri Jul 17 09:00:38 2015 (r285652) @@ -26,64 +26,154 @@ #include __FBSDID("$FreeBSD$"); +#include +#include +#include + #include +#include + +/* Converts CloudABI's memory protection flags to FreeBSD's. */ +static int +convert_mprot(cloudabi_mprot_t in) +{ + int out; + + out = 0; + if (in & CLOUDABI_PROT_EXEC) + out |= PROT_EXEC; + if (in & CLOUDABI_PROT_WRITE) + out |= PROT_WRITE; + if (in & CLOUDABI_PROT_READ) + out |= PROT_READ; + return (out); +} int cloudabi_sys_mem_advise(struct thread *td, struct cloudabi_sys_mem_advise_args *uap) { + struct madvise_args madvise_args = { + .addr = uap->addr, + .len = uap->len + }; + + switch (uap->advice) { + case CLOUDABI_ADVICE_DONTNEED: + madvise_args.behav = MADV_DONTNEED; + break; + case CLOUDABI_ADVICE_NORMAL: + madvise_args.behav = MADV_NORMAL; + break; + case CLOUDABI_ADVICE_RANDOM: + madvise_args.behav = MADV_RANDOM; + break; + case CLOUDABI_ADVICE_SEQUENTIAL: + madvise_args.behav = MADV_SEQUENTIAL; + break; + case CLOUDABI_ADVICE_WILLNEED: + madvise_args.behav = MADV_WILLNEED; + break; + default: + return (EINVAL); + } - /* Not implemented. */ - return (ENOSYS); + return (sys_madvise(td, &madvise_args)); } int cloudabi_sys_mem_lock(struct thread *td, struct cloudabi_sys_mem_lock_args *uap) { + struct mlock_args mlock_args = { + .addr = uap->addr, + .len = uap->len + }; - /* Not implemented. */ - return (ENOSYS); + return (sys_mlock(td, &mlock_args)); } 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, + .prot = convert_mprot(uap->prot), + .fd = uap->fd, + .pos = uap->off + }; + + /* Translate flags. */ + if (uap->flags & CLOUDABI_MAP_ANON) + mmap_args.flags |= MAP_ANON; + if (uap->flags & CLOUDABI_MAP_FIXED) + mmap_args.flags |= MAP_FIXED; + if (uap->flags & CLOUDABI_MAP_PRIVATE) + mmap_args.flags |= MAP_PRIVATE; + if (uap->flags & CLOUDABI_MAP_SHARED) + mmap_args.flags |= MAP_SHARED; - /* Not implemented. */ - return (ENOSYS); + return (sys_mmap(td, &mmap_args)); } int cloudabi_sys_mem_protect(struct thread *td, struct cloudabi_sys_mem_protect_args *uap) { + struct mprotect_args mprotect_args = { + .addr = uap->addr, + .len = uap->len, + .prot = convert_mprot(uap->prot), + }; - /* Not implemented. */ - return (ENOSYS); + return (sys_mprotect(td, &mprotect_args)); } int cloudabi_sys_mem_sync(struct thread *td, struct cloudabi_sys_mem_sync_args *uap) { + struct msync_args msync_args = { + .addr = uap->addr, + .len = uap->len, + }; + + /* Convert flags. */ + switch (uap->flags & (CLOUDABI_MS_ASYNC | CLOUDABI_MS_SYNC)) { + case CLOUDABI_MS_ASYNC: + msync_args.flags |= MS_ASYNC; + break; + case CLOUDABI_MS_SYNC: + msync_args.flags |= MS_SYNC; + break; + default: + return (EINVAL); + } + if ((uap->flags & CLOUDABI_MS_INVALIDATE) != 0) + msync_args.flags |= MS_INVALIDATE; - /* Not implemented. */ - return (ENOSYS); + return (sys_msync(td, &msync_args)); } int cloudabi_sys_mem_unlock(struct thread *td, struct cloudabi_sys_mem_unlock_args *uap) { + struct munlock_args munlock_args = { + .addr = uap->addr, + .len = uap->len + }; - /* Not implemented. */ - return (ENOSYS); + return (sys_munlock(td, &munlock_args)); } int cloudabi_sys_mem_unmap(struct thread *td, struct cloudabi_sys_mem_unmap_args *uap) { + struct munmap_args munmap_args = { + .addr = uap->addr, + .len = uap->len + }; - /* Not implemented. */ - return (ENOSYS); + return (sys_munmap(td, &munmap_args)); } Modified: head/sys/contrib/cloudabi/syscalldefs_mi.h ============================================================================== --- head/sys/contrib/cloudabi/syscalldefs_mi.h Fri Jul 17 08:37:13 2015 (r285651) +++ head/sys/contrib/cloudabi/syscalldefs_mi.h Fri Jul 17 09:00:38 2015 (r285652) @@ -216,6 +216,9 @@ #define CLOUDABI_MAP_PRIVATE 0x4 #define CLOUDABI_MAP_SHARED 0x8 +// File descriptor that must be passed in when using CLOUDABI_MAP_ANON. +#define CLOUDABI_MAP_ANON_FD 0xffffffff + // msync() flags. #define CLOUDABI_MS_ASYNC 0x1 #define CLOUDABI_MS_INVALIDATE 0x2