Add two more vmspace_*() system calls to read and write a vmspace. These
authorMatthew Dillon <dillon@dragonflybsd.org>
Tue, 10 Oct 2006 15:43:16 +0000 (15:43 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Tue, 10 Oct 2006 15:43:16 +0000 (15:43 +0000)
will be used by the virtual kernel to handle copyin/copyout.  The routines
are just empty wrappers at the moment.

Implement the body for vmspace_mmap() and vmspace_munmap().

sys/kern/init_sysent.c
sys/kern/syscalls.c
sys/kern/syscalls.master
sys/sys/syscall-hide.h
sys/sys/syscall.h
sys/sys/syscall.mk
sys/sys/sysproto.h
sys/sys/sysunion.h
sys/sys/vmspace.h
sys/vm/vm_vmspace.c

index 30706aa..356d251 100644 (file)
@@ -2,8 +2,8 @@
  * System call switch table.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $DragonFly: src/sys/kern/init_sysent.c,v 1.46 2006/09/17 21:07:32 dillon Exp $
- * created from DragonFly: src/sys/kern/syscalls.master,v 1.43 2006/09/13 17:10:39 dillon Exp 
+ * $DragonFly: src/sys/kern/init_sysent.c,v 1.47 2006/10/10 15:43:14 dillon Exp $
+ * created from DragonFly: src/sys/kern/syscalls.master,v 1.44 2006/09/17 21:07:32 dillon Exp 
  */
 
 #include "opt_compat.h"
@@ -526,4 +526,6 @@ struct sysent sysent[] = {
        { AS(vmspace_mmap_args), (sy_call_t *)sys_vmspace_mmap },       /* 489 = vmspace_mmap */
        { AS(vmspace_munmap_args), (sy_call_t *)sys_vmspace_munmap },   /* 490 = vmspace_munmap */
        { AS(vmspace_mcontrol_args), (sy_call_t *)sys_vmspace_mcontrol },       /* 491 = vmspace_mcontrol */
+       { AS(vmspace_pread_args), (sy_call_t *)sys_vmspace_pread },     /* 492 = vmspace_pread */
+       { AS(vmspace_pwrite_args), (sy_call_t *)sys_vmspace_pwrite },   /* 493 = vmspace_pwrite */
 };
index 1314b09..78d6dd7 100644 (file)
@@ -2,8 +2,8 @@
  * System call names.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $DragonFly: src/sys/kern/syscalls.c,v 1.45 2006/09/17 21:07:32 dillon Exp $
- * created from DragonFly: src/sys/kern/syscalls.master,v 1.43 2006/09/13 17:10:39 dillon Exp 
+ * $DragonFly: src/sys/kern/syscalls.c,v 1.46 2006/10/10 15:43:14 dillon Exp $
+ * created from DragonFly: src/sys/kern/syscalls.master,v 1.44 2006/09/17 21:07:32 dillon Exp 
  */
 
 char *syscallnames[] = {
@@ -501,4 +501,6 @@ char *syscallnames[] = {
        "vmspace_mmap",                 /* 489 = vmspace_mmap */
        "vmspace_munmap",                       /* 490 = vmspace_munmap */
        "vmspace_mcontrol",                     /* 491 = vmspace_mcontrol */
+       "vmspace_pread",                        /* 492 = vmspace_pread */
+       "vmspace_pwrite",                       /* 493 = vmspace_pwrite */
 };
index 6b23775..695b614 100644 (file)
@@ -1,4 +1,4 @@
- $DragonFly: src/sys/kern/syscalls.master,v 1.44 2006/09/17 21:07:32 dillon Exp $
+ $DragonFly: src/sys/kern/syscalls.master,v 1.45 2006/10/10 15:43:14 dillon Exp $
 
 ; @(#)syscalls.master  8.2 (Berkeley) 1/13/94
 ; $FreeBSD: src/sys/kern/syscalls.master,v 1.72.2.10 2002/07/12 08:22:46 alfred Exp $
                                          size_t len); }
 491    STD     BSD     { int vmspace_mcontrol(void *id, void *addr,    \
                                          size_t len, int behav, off_t value); } 
+492    STD     BSD     { ssize_t vmspace_pread(void *id, void *buf, \
+                           size_t nbyte, int flags, off_t offset); }
+493    STD     BSD     { ssize_t vmspace_pwrite(void *id, const void *buf, \
+                           size_t nbyte, int flags, off_t offset); }
index f979a99..5dc133f 100644 (file)
@@ -2,8 +2,8 @@
  * System call hiders.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $DragonFly: src/sys/sys/syscall-hide.h,v 1.46 2006/09/17 21:09:39 dillon Exp $
- * created from DragonFly: src/sys/kern/syscalls.master,v 1.43 2006/09/13 17:10:39 dillon Exp 
+ * $DragonFly: src/sys/sys/syscall-hide.h,v 1.47 2006/10/10 15:43:15 dillon Exp $
+ * created from DragonFly: src/sys/kern/syscalls.master,v 1.44 2006/09/17 21:07:32 dillon Exp 
  */
 
 #ifdef COMPAT_43
@@ -322,3 +322,5 @@ HIDE_BSD(vmspace_ctl)
 HIDE_BSD(vmspace_mmap)
 HIDE_BSD(vmspace_munmap)
 HIDE_BSD(vmspace_mcontrol)
+HIDE_BSD(vmspace_pread)
+HIDE_BSD(vmspace_pwrite)
index e2312a9..a62c36c 100644 (file)
@@ -2,8 +2,8 @@
  * System call numbers.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $DragonFly: src/sys/sys/syscall.h,v 1.46 2006/09/17 21:09:39 dillon Exp $
- * created from DragonFly: src/sys/kern/syscalls.master,v 1.43 2006/09/13 17:10:39 dillon Exp 
+ * $DragonFly: src/sys/sys/syscall.h,v 1.47 2006/10/10 15:43:15 dillon Exp $
+ * created from DragonFly: src/sys/kern/syscalls.master,v 1.44 2006/09/17 21:07:32 dillon Exp 
  */
 
 #define        SYS_syscall     0
 #define        SYS_vmspace_mmap        489
 #define        SYS_vmspace_munmap      490
 #define        SYS_vmspace_mcontrol    491
-#define        SYS_MAXSYSCALL  492
+#define        SYS_vmspace_pread       492
+#define        SYS_vmspace_pwrite      493
+#define        SYS_MAXSYSCALL  494
index ad747e5..e02dc2f 100644 (file)
@@ -1,7 +1,7 @@
 # DragonFly system call names.
 # DO NOT EDIT-- this file is automatically generated.
-# $DragonFly: src/sys/sys/syscall.mk,v 1.46 2006/09/17 21:09:39 dillon Exp $
-# created from DragonFly: src/sys/kern/syscalls.master,v 1.43 2006/09/13 17:10:39 dillon Exp 
+# $DragonFly: src/sys/sys/syscall.mk,v 1.47 2006/10/10 15:43:15 dillon Exp $
+# created from DragonFly: src/sys/kern/syscalls.master,v 1.44 2006/09/17 21:07:32 dillon Exp 
 MIASM =  \
        syscall.o \
        exit.o \
@@ -273,4 +273,6 @@ MIASM =  \
        vmspace_ctl.o \
        vmspace_mmap.o \
        vmspace_munmap.o \
-       vmspace_mcontrol.o
+       vmspace_mcontrol.o \
+       vmspace_pread.o \
+       vmspace_pwrite.o
index 5295310..68e0b85 100644 (file)
@@ -2,8 +2,8 @@
  * System call prototypes.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $DragonFly: src/sys/sys/sysproto.h,v 1.46 2006/09/17 21:09:39 dillon Exp $
- * created from DragonFly: src/sys/kern/syscalls.master,v 1.43 2006/09/13 17:10:39 dillon Exp 
+ * $DragonFly: src/sys/sys/sysproto.h,v 1.47 2006/10/10 15:43:15 dillon Exp $
+ * created from DragonFly: src/sys/kern/syscalls.master,v 1.44 2006/09/17 21:07:32 dillon Exp 
  */
 
 #ifndef _SYS_SYSPROTO_H_
@@ -2049,6 +2049,26 @@ struct   vmspace_mcontrol_args {
        int     behav;  char behav_[PAD_(int)];
        off_t   value;  char value_[PAD_(off_t)];
 };
+struct vmspace_pread_args {
+#ifdef _KERNEL
+       struct sysmsg sysmsg;
+#endif
+       void *  id;     char id_[PAD_(void *)];
+       void *  buf;    char buf_[PAD_(void *)];
+       size_t  nbyte;  char nbyte_[PAD_(size_t)];
+       int     flags;  char flags_[PAD_(int)];
+       off_t   offset; char offset_[PAD_(off_t)];
+};
+struct vmspace_pwrite_args {
+#ifdef _KERNEL
+       struct sysmsg sysmsg;
+#endif
+       void *  id;     char id_[PAD_(void *)];
+       const void *    buf;    char buf_[PAD_(const void *)];
+       size_t  nbyte;  char nbyte_[PAD_(size_t)];
+       int     flags;  char flags_[PAD_(int)];
+       off_t   offset; char offset_[PAD_(off_t)];
+};
 
 #ifdef COMPAT_43
 
@@ -2621,6 +2641,8 @@ int       sys_vmspace_ctl (struct vmspace_ctl_args *);
 int    sys_vmspace_mmap (struct vmspace_mmap_args *);
 int    sys_vmspace_munmap (struct vmspace_munmap_args *);
 int    sys_vmspace_mcontrol (struct vmspace_mcontrol_args *);
+int    sys_vmspace_pread (struct vmspace_pread_args *);
+int    sys_vmspace_pwrite (struct vmspace_pwrite_args *);
 
 #endif /* !_SYS_SYSPROTO_H_ */
 #undef PAD_
index df6e089..73da4bc 100644 (file)
@@ -2,8 +2,8 @@
  * Union of syscall args for messaging.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $DragonFly: src/sys/sys/sysunion.h,v 1.43 2006/09/17 21:09:39 dillon Exp $
- * created from DragonFly: src/sys/kern/syscalls.master,v 1.43 2006/09/13 17:10:39 dillon Exp 
+ * $DragonFly: src/sys/sys/sysunion.h,v 1.44 2006/10/10 15:43:15 dillon Exp $
+ * created from DragonFly: src/sys/kern/syscalls.master,v 1.44 2006/09/17 21:07:32 dillon Exp 
  */
 
 union sysunion {
@@ -378,4 +378,6 @@ union sysunion {
        struct  vmspace_mmap_args vmspace_mmap;
        struct  vmspace_munmap_args vmspace_munmap;
        struct  vmspace_mcontrol_args vmspace_mcontrol;
+       struct  vmspace_pread_args vmspace_pread;
+       struct  vmspace_pwrite_args vmspace_pwrite;
 };
index fb9b222..0f5583d 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/sys/vmspace.h,v 1.2 2006/09/17 21:09:39 dillon Exp $
+ * $DragonFly: src/sys/sys/vmspace.h,v 1.3 2006/10/10 15:43:15 dillon Exp $
  */
 /*
  * VMSPACE - Virtualized Environment control from user mode.  The VMSPACE
 #include <sys/types.h>
 #endif
 
-#define VMSPACE_CTL_VKERNEL    1
-#define VMSPACE_CTL_CREATE     2
-#define VMSPACE_CTL_DESTROY    3
-#define VMSPACE_CTL_RUN                4
+#define VMSPACE_CTL_RUN                1
 
 #define VMSPACE_PAGEFAULT      1
 #define VMSPACE_TIMEOUT                2
 
 #ifndef _KERNEL
 
-int vmspace_ctl(void *id, void *ctx, int what);
-int vmspace_map(void *id, off_t offset, void *ptr, int bytes, int prot);
-int vmspace_protect(void *id, off_t offset, int bytes, int prot);
-int vmspace_read(void *id, void *ptr, int bytes);
-int vmspace_write(void *id, const void *ptr, int bytes);
+int vmspace_create(void *, int, void *);
+int vmspace_destroy(void *);
+int vmspace_ctl(void *, int, void *, int, int);
+int vmspace_mmap(void *, void *, size_t, int, int, int, off_t);
+int vmspace_munmap(void *, void *, size_t);
+int vmspace_mcontrol(void *, void *, size_t, int, off_t);
+ssize_t vmspace_pread(void *, void *, size_t, int, off_t);
+ssize_t vmspace_pwrite(void *, const void *, size_t, int, off_t);
+
+#endif
 
 #endif
 
index e712efb..736fec7 100644 (file)
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/vm/vm_vmspace.c,v 1.2 2006/09/17 21:09:40 dillon Exp $
+ * $DragonFly: src/sys/vm/vm_vmspace.c,v 1.3 2006/10/10 15:43:16 dillon Exp $
  */
 
 #include <sys/param.h>
 #include <sys/kernel.h>
 #include <sys/systm.h>
 #include <sys/sysproto.h>
+#include <sys/kern_syscall.h>
 #include <sys/mman.h>
 #include <sys/proc.h>
 #include <sys/malloc.h>
@@ -122,7 +123,7 @@ sys_vmspace_destroy(struct vmspace_destroy_args *uap)
  *
  * Transfer control to a VMSPACE.  Control is returned after the specified
  * number of microseconds or if a page fault, signal, trap, or system call
- * occurs.
+ * occurs.  The context is updated as appropriate.
  */
 int
 sys_vmspace_ctl(struct vmspace_ctl_args *uap)
@@ -149,12 +150,16 @@ sys_vmspace_mmap(struct vmspace_mmap_args *uap)
 {
        struct vkernel *vk;
        struct vmspace_entry *ve;
+       int error;
 
        if ((vk = curproc->p_vkernel) == NULL)
                return (EINVAL);
        if ((ve = vkernel_find_vmspace(vk, uap->id)) == NULL)
                return (ENOENT);
-       return(EINVAL);
+       error = kern_mmap(ve->vmspace, uap->addr, uap->len,
+                         uap->prot, uap->flags,
+                         uap->fd, uap->offset, &uap->sysmsg_resultp);
+       return (error);
 }
 
 /*
@@ -167,12 +172,83 @@ sys_vmspace_munmap(struct vmspace_munmap_args *uap)
 {
        struct vkernel *vk;
        struct vmspace_entry *ve;
+       vm_offset_t addr;
+       vm_size_t size, pageoff;
+       vm_map_t map;
 
        if ((vk = curproc->p_vkernel) == NULL)
                return (EINVAL);
        if ((ve = vkernel_find_vmspace(vk, uap->id)) == NULL)
                return (ENOENT);
-       return(EINVAL);
+
+       /*
+        * Copied from sys_munmap()
+        */
+       addr = (vm_offset_t)uap->addr;
+       size = uap->len;
+
+       pageoff = (addr & PAGE_MASK);
+       addr -= pageoff;
+       size += pageoff;
+       size = (vm_size_t)round_page(size);
+       if (addr + size < addr)
+               return (EINVAL);
+       if (size == 0)
+               return (0);
+
+       if (VM_MAXUSER_ADDRESS > 0 && addr + size > VM_MAXUSER_ADDRESS)
+               return (EINVAL);
+#ifndef i386
+       if (VM_MIN_ADDRESS > 0 && addr < VM_MIN_ADDRESS)
+               return (EINVAL);
+#endif
+       map = &ve->vmspace->vm_map;
+       if (!vm_map_check_protection(map, addr, addr + size, VM_PROT_NONE))
+               return (EINVAL);
+       vm_map_remove(map, addr, addr + size);
+       return (0);
+}
+
+/* 
+ * vmspace_pread(id, buf, nbyte, flags, offset)
+ *
+ * Read data from a vmspace.  The number of bytes read is returned or
+ * -1 if an unrecoverable error occured.  If the number of bytes read is
+ * less then the request size, a page fault occured in the VMSPACE which
+ * the caller must resolve in order to proceed.
+ */
+int
+sys_vmspace_pread(struct vmspace_pread_args *uap)
+{
+       struct vkernel *vk;
+       struct vmspace_entry *ve;
+
+       if ((vk = curproc->p_vkernel) == NULL)
+               return (EINVAL);
+       if ((ve = vkernel_find_vmspace(vk, uap->id)) == NULL)
+               return (ENOENT);
+       return (EINVAL);
+}
+
+/*
+ * vmspace_pwrite(id, buf, nbyte, flags, offset)
+ *
+ * Write data to a vmspace.  The number of bytes written is returned or
+ * -1 if an unrecoverable error occured.  If the number of bytes written is
+ * less then the request size, a page fault occured in the VMSPACE which
+ * the caller must resolve in order to proceed.
+ */
+int
+sys_vmspace_pwrite(struct vmspace_pwrite_args *uap)
+{
+       struct vkernel *vk;
+       struct vmspace_entry *ve;
+
+       if ((vk = curproc->p_vkernel) == NULL)
+               return (EINVAL);
+       if ((ve = vkernel_find_vmspace(vk, uap->id)) == NULL)
+               return (ENOENT);
+       return (EINVAL);
 }
 
 /*