Add skeleton procedures for the vmspace_*() series of system calls which
authorMatthew Dillon <dillon@dragonflybsd.org>
Sun, 3 Sep 2006 17:11:51 +0000 (17:11 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Sun, 3 Sep 2006 17:11:51 +0000 (17:11 +0000)
will be used by virtual kernels to implement processes.

sys/conf/files
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 [new file with mode: 0644]
sys/vm/vm_vmspace.c [new file with mode: 0644]

index beff709..d88cf01 100644 (file)
@@ -1,5 +1,5 @@
 # $FreeBSD: src/sys/conf/files,v 1.340.2.137 2003/06/04 17:10:30 sam Exp $
-# $DragonFly: src/sys/conf/files,v 1.139 2006/09/03 07:37:58 sephe Exp $
+# $DragonFly: src/sys/conf/files,v 1.140 2006/09/03 17:11:47 dillon Exp $
 #
 # The long compile-with and dependency lines are required because of
 # limitations in config: backslash-newline doesn't work in strings, and
@@ -1119,6 +1119,7 @@ vm/vm_pageout.c                   standard
 vm/vm_pager.c                  standard
 vm/vm_swap.c                   standard
 vm/vm_unix.c                   standard
+vm/vm_vmspace.c                        standard
 vm/vnode_pager.c               standard
 vm/vm_zone.c                   standard
 #
index e4be5de..d3eb729 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.43 2006/08/06 18:56:44 dillon Exp $
- * created from DragonFly: src/sys/kern/syscalls.master,v 1.40 2006/06/13 21:04:16 dillon Exp 
+ * $DragonFly: src/sys/kern/init_sysent.c,v 1.44 2006/09/03 17:11:48 dillon Exp $
+ * created from DragonFly: src/sys/kern/syscalls.master,v 1.41 2006/08/06 18:56:44 dillon Exp 
  */
 
 #include "opt_compat.h"
@@ -519,4 +519,9 @@ struct sysent sysent[] = {
        { AS(__accept_args), (sy_call_t *)sys___accept },       /* 482 = __accept */
        { AS(__connect_args), (sy_call_t *)sys___connect },     /* 483 = __connect */
        { AS(syslink_args), (sy_call_t *)sys_syslink }, /* 484 = syslink */
+       { AS(vmspace_ctl_args), (sy_call_t *)sys_vmspace_ctl }, /* 485 = vmspace_ctl */
+       { AS(vmspace_map_args), (sy_call_t *)sys_vmspace_map }, /* 486 = vmspace_map */
+       { AS(vmspace_protect_args), (sy_call_t *)sys_vmspace_protect }, /* 487 = vmspace_protect */
+       { AS(vmspace_read_args), (sy_call_t *)sys_vmspace_read },       /* 488 = vmspace_read */
+       { AS(vmspace_write_args), (sy_call_t *)sys_vmspace_write },     /* 489 = vmspace_write */
 };
index 94dca64..81a8c61 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.42 2006/08/06 18:56:44 dillon Exp $
- * created from DragonFly: src/sys/kern/syscalls.master,v 1.40 2006/06/13 21:04:16 dillon Exp 
+ * $DragonFly: src/sys/kern/syscalls.c,v 1.43 2006/09/03 17:11:48 dillon Exp $
+ * created from DragonFly: src/sys/kern/syscalls.master,v 1.41 2006/08/06 18:56:44 dillon Exp 
  */
 
 char *syscallnames[] = {
@@ -494,4 +494,9 @@ char *syscallnames[] = {
        "__accept",                     /* 482 = __accept */
        "__connect",                    /* 483 = __connect */
        "syslink",                      /* 484 = syslink */
+       "vmspace_ctl",                  /* 485 = vmspace_ctl */
+       "vmspace_map",                  /* 486 = vmspace_map */
+       "vmspace_protect",                      /* 487 = vmspace_protect */
+       "vmspace_read",                 /* 488 = vmspace_read */
+       "vmspace_write",                        /* 489 = vmspace_write */
 };
index f6a1080..1455577 100644 (file)
@@ -1,4 +1,4 @@
- $DragonFly: src/sys/kern/syscalls.master,v 1.41 2006/08/06 18:56:44 dillon Exp $
+ $DragonFly: src/sys/kern/syscalls.master,v 1.42 2006/09/03 17:11:48 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 $
 482    STD     BSD     { int __accept(int s, int flags, caddr_t name, int *anamelen); }
 483    STD     BSD     { int __connect(int s, int flags, caddr_t name, int namelen); }
 484    STD     BSD     { int syslink(int fd, int cmd, sysid_t *mask, sysid_t *match); }
+485    STD     BSD     { int vmspace_ctl(void *id, void *ctx, int what); } 
+486    STD     BSD     { int vmspace_map(void *id, off_t offset, void *ptr, \
+                                         int bytes, int prot); }
+487    STD     BSD     { int vmspace_protect(void *id, off_t offset, \
+                                         int bytes, int prot); } 
+488    STD     BSD     { int vmspace_read(void *id, void *ptr, int bytes); } 
+489    STD     BSD     { int vmspace_write(void *id, const void *ptr, \
+                                         int bytes); } 
index e7c1415..3c638eb 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.43 2006/08/06 18:56:46 dillon Exp $
- * created from DragonFly: src/sys/kern/syscalls.master,v 1.40 2006/06/13 21:04:16 dillon Exp 
+ * $DragonFly: src/sys/sys/syscall-hide.h,v 1.44 2006/09/03 17:11:50 dillon Exp $
+ * created from DragonFly: src/sys/kern/syscalls.master,v 1.41 2006/08/06 18:56:44 dillon Exp 
  */
 
 #ifdef COMPAT_43
@@ -315,3 +315,8 @@ HIDE_BSD(usched_set)
 HIDE_BSD(__accept)
 HIDE_BSD(__connect)
 HIDE_BSD(syslink)
+HIDE_BSD(vmspace_ctl)
+HIDE_BSD(vmspace_map)
+HIDE_BSD(vmspace_protect)
+HIDE_BSD(vmspace_read)
+HIDE_BSD(vmspace_write)
index 7e69509..1d07115 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.43 2006/08/06 18:56:46 dillon Exp $
- * created from DragonFly: src/sys/kern/syscalls.master,v 1.40 2006/06/13 21:04:16 dillon Exp 
+ * $DragonFly: src/sys/sys/syscall.h,v 1.44 2006/09/03 17:11:50 dillon Exp $
+ * created from DragonFly: src/sys/kern/syscalls.master,v 1.41 2006/08/06 18:56:44 dillon Exp 
  */
 
 #define        SYS_syscall     0
 #define        SYS___accept    482
 #define        SYS___connect   483
 #define        SYS_syslink     484
-#define        SYS_MAXSYSCALL  485
+#define        SYS_vmspace_ctl 485
+#define        SYS_vmspace_map 486
+#define        SYS_vmspace_protect     487
+#define        SYS_vmspace_read        488
+#define        SYS_vmspace_write       489
+#define        SYS_MAXSYSCALL  490
index 5199a67..ab8564a 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.43 2006/08/06 18:56:46 dillon Exp $
-# created from DragonFly: src/sys/kern/syscalls.master,v 1.40 2006/06/13 21:04:16 dillon Exp 
+# $DragonFly: src/sys/sys/syscall.mk,v 1.44 2006/09/03 17:11:50 dillon Exp $
+# created from DragonFly: src/sys/kern/syscalls.master,v 1.41 2006/08/06 18:56:44 dillon Exp 
 MIASM =  \
        syscall.o \
        exit.o \
@@ -266,4 +266,9 @@ MIASM =  \
        usched_set.o \
        __accept.o \
        __connect.o \
-       syslink.o
+       syslink.o \
+       vmspace_ctl.o \
+       vmspace_map.o \
+       vmspace_protect.o \
+       vmspace_read.o \
+       vmspace_write.o
index fd6b642..bab4880 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.43 2006/08/06 18:56:46 dillon Exp $
- * created from DragonFly: src/sys/kern/syscalls.master,v 1.40 2006/06/13 21:04:16 dillon Exp 
+ * $DragonFly: src/sys/sys/sysproto.h,v 1.44 2006/09/03 17:11:50 dillon Exp $
+ * created from DragonFly: src/sys/kern/syscalls.master,v 1.41 2006/08/06 18:56:44 dillon Exp 
  */
 
 #ifndef _SYS_SYSPROTO_H_
@@ -1986,6 +1986,49 @@ struct   syslink_args {
        sysid_t *       mask;   char mask_[PAD_(sysid_t *)];
        sysid_t *       match;  char match_[PAD_(sysid_t *)];
 };
+struct vmspace_ctl_args {
+#ifdef _KERNEL
+       struct sysmsg sysmsg;
+#endif
+       void *  id;     char id_[PAD_(void *)];
+       void *  ctx;    char ctx_[PAD_(void *)];
+       int     what;   char what_[PAD_(int)];
+};
+struct vmspace_map_args {
+#ifdef _KERNEL
+       struct sysmsg sysmsg;
+#endif
+       void *  id;     char id_[PAD_(void *)];
+       off_t   offset; char offset_[PAD_(off_t)];
+       void *  ptr;    char ptr_[PAD_(void *)];
+       int     bytes;  char bytes_[PAD_(int)];
+       int     prot;   char prot_[PAD_(int)];
+};
+struct vmspace_protect_args {
+#ifdef _KERNEL
+       struct sysmsg sysmsg;
+#endif
+       void *  id;     char id_[PAD_(void *)];
+       off_t   offset; char offset_[PAD_(off_t)];
+       int     bytes;  char bytes_[PAD_(int)];
+       int     prot;   char prot_[PAD_(int)];
+};
+struct vmspace_read_args {
+#ifdef _KERNEL
+       struct sysmsg sysmsg;
+#endif
+       void *  id;     char id_[PAD_(void *)];
+       void *  ptr;    char ptr_[PAD_(void *)];
+       int     bytes;  char bytes_[PAD_(int)];
+};
+struct vmspace_write_args {
+#ifdef _KERNEL
+       struct sysmsg sysmsg;
+#endif
+       void *  id;     char id_[PAD_(void *)];
+       const void *    ptr;    char ptr_[PAD_(const void *)];
+       int     bytes;  char bytes_[PAD_(int)];
+};
 
 #ifdef COMPAT_43
 
@@ -2551,6 +2594,11 @@ int      sys_usched_set (struct usched_set_args *);
 int    sys___accept (struct __accept_args *);
 int    sys___connect (struct __connect_args *);
 int    sys_syslink (struct syslink_args *);
+int    sys_vmspace_ctl (struct vmspace_ctl_args *);
+int    sys_vmspace_map (struct vmspace_map_args *);
+int    sys_vmspace_protect (struct vmspace_protect_args *);
+int    sys_vmspace_read (struct vmspace_read_args *);
+int    sys_vmspace_write (struct vmspace_write_args *);
 
 #endif /* !_SYS_SYSPROTO_H_ */
 #undef PAD_
index 47fd90c..afd1f55 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.40 2006/08/06 18:56:46 dillon Exp $
- * created from DragonFly: src/sys/kern/syscalls.master,v 1.40 2006/06/13 21:04:16 dillon Exp 
+ * $DragonFly: src/sys/sys/sysunion.h,v 1.41 2006/09/03 17:11:50 dillon Exp $
+ * created from DragonFly: src/sys/kern/syscalls.master,v 1.41 2006/08/06 18:56:44 dillon Exp 
  */
 
 union sysunion {
@@ -371,4 +371,9 @@ union sysunion {
        struct  __accept_args __accept;
        struct  __connect_args __connect;
        struct  syslink_args syslink;
+       struct  vmspace_ctl_args vmspace_ctl;
+       struct  vmspace_map_args vmspace_map;
+       struct  vmspace_protect_args vmspace_protect;
+       struct  vmspace_read_args vmspace_read;
+       struct  vmspace_write_args vmspace_write;
 };
diff --git a/sys/sys/vmspace.h b/sys/sys/vmspace.h
new file mode 100644 (file)
index 0000000..da7617c
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2006 The DragonFly Project.  All rights reserved.
+ * 
+ * This code is derived from software contributed to The DragonFly Project
+ * by Matthew Dillon <dillon@backplane.com>
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name of The DragonFly Project nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific, prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * 
+ * $DragonFly: src/sys/sys/vmspace.h,v 1.1 2006/09/03 17:11:50 dillon Exp $
+ */
+/*
+ * VMSPACE - Virtualized Environment control from user mode.  The VMSPACE
+ * subsystem allows a user mode application, such as a user-mode DragonFly
+ * kernel, to create, manipulate, and execute code in a separate VM context.
+ */
+
+#ifndef _SYS_VMSPACE_H_
+#define _SYS_VMSPACE_H_
+
+#ifndef _SYS_TYPES_H_
+#include <sys/types.h>
+#endif
+
+#define VMSPACE_CTL_CREATE     1
+#define VMSPACE_CTL_DESTROY    2
+#define VMSPACE_CTL_RUN                3
+
+#define VMSPACE_PAGEFAULT      1
+#define VMSPACE_TIMEOUT                2
+#define VMSPACE_TRAP           3
+#define VMSPACE_SYSCALL                4
+
+#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);
+
+#endif
+
diff --git a/sys/vm/vm_vmspace.c b/sys/vm/vm_vmspace.c
new file mode 100644 (file)
index 0000000..ee65607
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2006 The DragonFly Project.  All rights reserved.
+ * 
+ * This code is derived from software contributed to The DragonFly Project
+ * by Matthew Dillon <dillon@backplane.com>
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name of The DragonFly Project nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific, prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * 
+ * $DragonFly: src/sys/vm/vm_vmspace.c,v 1.1 2006/09/03 17:11:51 dillon Exp $
+ */
+
+#include <sys/param.h>
+#include <sys/kernel.h>
+#include <sys/systm.h>
+#include <sys/sysproto.h>
+
+/*
+ * vmspace_ctl {void *id, void *ctx, int what }
+ *
+ * Create, destroy, or execute a VM space.  This functions returns when
+ * the VM space has run for a specified period of time, a signal occurs,
+ * or the VM space traps or makes a system call.
+ *
+ * Execution of a VM space is accomplished by swapping out the caller's
+ * current VM space.  Any signal or condition applicable to the caller
+ * will swap the caller's VM space back in for processing, then return
+ * EINTR.  A trap, system call, or page fault in the VM space will swap
+ * the caller's VM space back in, adjust the context, and return the
+ * appropriate code.
+ *
+ * A virtual kernel manages multiple 'process' VM spaces this way, the
+ * real kernel only sees only the processes representing the virtual kernel
+ * itself, typically one per virtual cpu.
+ */
+int
+sys_vmspace_ctl(struct vmspace_ctl_args *uap)
+{
+       return (EINVAL);
+}
+
+/*
+ * vmspace_map { void *id, off_t offset, void *ptr, int bytes, int prot }
+ *
+ * Map pages backing the specified memory in the caller's context into
+ * the specified VM space and reduce their protection using 'prot'.  A
+ * protection value of 0 removes the page mapping.  Page mappings can be
+ * removed by the kernel at any time and cause execution of the VM space
+ * to return with VMSPACE_PAGEFAULT.
+ */
+int
+sys_vmspace_map(struct vmspace_map_args *uap)
+{
+       return (EINVAL);
+}
+
+/*
+ * vmspace_protect { void *id, off_t offset, int bytes, int prot }
+ *
+ * Adjust the protection of mapped pages in the specified VM context.  Pages
+ * that are not mapped or whos mapping was removed by the kernel are not
+ * effected.
+ */
+int
+sys_vmspace_protect(struct vmspace_protect_args *uap)
+{
+       return (EINVAL);
+}
+
+/*
+ * vmspace_read { void *id, void *ptr, int bytes }
+ *
+ * Read data from the VM space.  Only data in mapped pages can be read.  If
+ * an unmapped page is encountered this function will return fewer then the
+ * requested number of bytes and the caller must map the additional pages
+ * before restarting the call.
+ */
+int
+sys_vmspace_read(struct vmspace_read_args *uap)
+{
+       return (EINVAL);
+}
+
+/*
+ * vmspace_write { void *id, const void *ptr, int bytes }
+ *
+ * Write data to the VM space.  Only mapped, writable pages can be written.
+ * If an unmapped or read-only page is encountered this function will return
+ * fewer then the requested number of bytes and the caller must map the
+ * additional pages before restarting the call.
+ */
+int
+sys_vmspace_write(struct vmspace_write_args *uap)
+{
+       return (EINVAL);
+}
+