svn commit: r252287 - in projects/vps: etc/mtree include sbin sbin/mount_vpsfs sys sys/amd64/amd64 sys/amd64/ia32 sys/amd64/include sys/amd64/linux32 sys/cddl/compat/opensolaris/kern sys/compat/lin...
Will Andrews
will at FreeBSD.org
Thu Jun 27 00:56:13 UTC 2013
Author: will
Date: Thu Jun 27 00:56:09 2013
New Revision: 252287
URL: http://svnweb.freebsd.org/changeset/base/252287
Log:
Initial version of VPS - Virtual Private Systems for FreeBSD.
VPS is an extension of the VIMAGE concept to the rest of the kernel (OS-level
virtualization, similar to jails), and can e.g. migrate live VPSs from one
host to another.
It was presented at EuroBSDCon 2010, and has since received many fixes, been
updated, cleaned up, and properly merged into the FreeBSD build by the author.
Submitted by: Klaus P. Ohrhallinger <k at 7he.at>
URL: http://7he.at/freebsd/vps/
Added:
projects/vps/sbin/mount_vpsfs/
projects/vps/sbin/mount_vpsfs/Makefile
projects/vps/sbin/mount_vpsfs/mount_vpsfs.8
projects/vps/sbin/mount_vpsfs/mount_vpsfs.c
projects/vps/sys/amd64/amd64/vps_machdep.c
projects/vps/sys/amd64/include/vps_md.h
projects/vps/sys/fs/vpsfs/
projects/vps/sys/fs/vpsfs/vpsfs.h
projects/vps/sys/fs/vpsfs/vpsfs_quota.c
projects/vps/sys/fs/vpsfs/vpsfs_subr.c
projects/vps/sys/fs/vpsfs/vpsfs_vfsops.c
projects/vps/sys/fs/vpsfs/vpsfs_vnops.c
projects/vps/sys/i386/i386/vps_machdep.c
projects/vps/sys/i386/include/vps_md.h
projects/vps/sys/mips/include/vps_md.h
projects/vps/sys/mips/mips/vps_machdep.c
projects/vps/sys/modules/if_vps/
projects/vps/sys/modules/if_vps/Makefile
projects/vps/sys/modules/vps_account/
projects/vps/sys/modules/vps_account/Makefile
projects/vps/sys/modules/vps_ddb/
projects/vps/sys/modules/vps_ddb/Makefile
projects/vps/sys/modules/vps_dev/
projects/vps/sys/modules/vps_dev/Makefile
projects/vps/sys/modules/vps_libdump/
projects/vps/sys/modules/vps_libdump/Makefile
projects/vps/sys/modules/vps_restore/
projects/vps/sys/modules/vps_restore/Makefile
projects/vps/sys/modules/vps_snapst/
projects/vps/sys/modules/vps_snapst/Makefile
projects/vps/sys/modules/vps_suspend/
projects/vps/sys/modules/vps_suspend/Makefile
projects/vps/sys/modules/vpsfs/
projects/vps/sys/modules/vpsfs/Makefile
projects/vps/sys/sys/vnet2.h
projects/vps/sys/vps/
projects/vps/sys/vps/if_vps.c
projects/vps/sys/vps/vps.h
projects/vps/sys/vps/vps2.h
projects/vps/sys/vps/vps_account.c
projects/vps/sys/vps/vps_account.h
projects/vps/sys/vps/vps_console.c
projects/vps/sys/vps/vps_core.c
projects/vps/sys/vps/vps_ddb.c
projects/vps/sys/vps/vps_dev.c
projects/vps/sys/vps/vps_devfsruleset.h
projects/vps/sys/vps/vps_int.h
projects/vps/sys/vps/vps_libdump.c
projects/vps/sys/vps/vps_libdump.h
projects/vps/sys/vps/vps_pager.c
projects/vps/sys/vps/vps_priv.c
projects/vps/sys/vps/vps_restore.c
projects/vps/sys/vps/vps_snapst.c
projects/vps/sys/vps/vps_snapst.h
projects/vps/sys/vps/vps_suspend.c
projects/vps/sys/vps/vps_user.c
projects/vps/sys/vps/vps_user.h
projects/vps/tools/vps/
projects/vps/tools/vps/autobuild/
projects/vps/tools/vps/autobuild/Makefile
projects/vps/tools/vps/autobuild/pkg-files/
projects/vps/tools/vps/autobuild/pkg-files/dist/
projects/vps/tools/vps/autobuild/pkg-files/dist/etc_vps_example.conf
projects/vps/tools/vps/autobuild/pkg-files/dist/vpssetup.sh
projects/vps/tools/vps/autobuild/pkg-files/pkg-comment
projects/vps/tools/vps/autobuild/pkg-files/pkg-descr
projects/vps/tools/vps/autobuild/pkg-files/pkg-message
projects/vps/tools/vps/autobuild/pkg-files/pkg_install_post.sh
projects/vps/tools/vps/autobuild/pkg-files/pkg_install_pre.sh
projects/vps/tools/vps/autobuild/pkg-files/pkg_remove_post.sh
projects/vps/tools/vps/autobuild/pkg-files/pkg_remove_pre.sh
projects/vps/tools/vps/autoinstalldist.sh
projects/vps/tools/vps/builddist.sh
projects/vps/tools/vps/check_linelength.pl
projects/vps/tools/vps/dist-README
projects/vps/tools/vps/installdist.sh
projects/vps/tools/vps/makepublicdiff.sh
projects/vps/tools/vps/merge.sh
projects/vps/tools/vps/rsync/
projects/vps/tools/vps/rsync/README
projects/vps/tools/vps/rsync/rsync-20100417.diff
projects/vps/tools/vps/rsync/rsync-20120604.diff
projects/vps/tools/vps/setup.sh
projects/vps/tools/vps/splitdiff.pl
projects/vps/usr.sbin/vpsctl/
projects/vps/usr.sbin/vpsctl/Makefile
projects/vps/usr.sbin/vpsctl/mkprivlist.c
projects/vps/usr.sbin/vpsctl/vps.4
projects/vps/usr.sbin/vpsctl/vps.9
projects/vps/usr.sbin/vpsctl/vps.conf.5
projects/vps/usr.sbin/vpsctl/vpsctl.8
projects/vps/usr.sbin/vpsctl/vpsctl.c
projects/vps/usr.sbin/vpsctl/vpsctl.h
Modified:
projects/vps/etc/mtree/BSD.include.dist
projects/vps/include/Makefile
projects/vps/sbin/Makefile
projects/vps/sys/Makefile
projects/vps/sys/amd64/amd64/exception.S
projects/vps/sys/amd64/amd64/identcpu.c
projects/vps/sys/amd64/amd64/pmap.c
projects/vps/sys/amd64/amd64/trap.c
projects/vps/sys/amd64/ia32/ia32_exception.S
projects/vps/sys/amd64/linux32/linux32_machdep.c
projects/vps/sys/cddl/compat/opensolaris/kern/opensolaris.c
projects/vps/sys/cddl/compat/opensolaris/kern/opensolaris_misc.c
projects/vps/sys/cddl/compat/opensolaris/kern/opensolaris_sunddi.c
projects/vps/sys/compat/linprocfs/linprocfs.c
projects/vps/sys/compat/linux/linux_emul.c
projects/vps/sys/compat/linux/linux_file.c
projects/vps/sys/compat/linux/linux_fork.c
projects/vps/sys/compat/linux/linux_ioctl.c
projects/vps/sys/compat/linux/linux_ipc.c
projects/vps/sys/compat/linux/linux_mib.c
projects/vps/sys/compat/linux/linux_misc.c
projects/vps/sys/compat/svr4/svr4_misc.c
projects/vps/sys/conf/files
projects/vps/sys/conf/files.amd64
projects/vps/sys/conf/files.i386
projects/vps/sys/conf/files.mips
projects/vps/sys/conf/options
projects/vps/sys/ddb/db_command.c
projects/vps/sys/ddb/db_ps.c
projects/vps/sys/ddb/db_thread.c
projects/vps/sys/dev/firewire/firewire.c
projects/vps/sys/dev/hwpmc/hwpmc_mod.c
projects/vps/sys/dev/syscons/daemon/daemon_saver.c
projects/vps/sys/dev/syscons/syscons.c
projects/vps/sys/fs/devfs/devfs.h
projects/vps/sys/fs/devfs/devfs_devs.c
projects/vps/sys/fs/devfs/devfs_rule.c
projects/vps/sys/fs/devfs/devfs_vfsops.c
projects/vps/sys/fs/devfs/devfs_vnops.c
projects/vps/sys/fs/fdescfs/fdesc_vnops.c
projects/vps/sys/fs/nfs/nfsport.h
projects/vps/sys/fs/nfsclient/nfs_clvfsops.c
projects/vps/sys/fs/procfs/procfs_ctl.c
projects/vps/sys/fs/procfs/procfs_status.c
projects/vps/sys/fs/pseudofs/pseudofs_vnops.c
projects/vps/sys/i386/i386/exception.s
projects/vps/sys/i386/i386/identcpu.c
projects/vps/sys/i386/i386/mp_machdep.c
projects/vps/sys/i386/i386/pmap.c
projects/vps/sys/i386/ibcs2/ibcs2_sysvec.c
projects/vps/sys/i386/linux/linux_machdep.c
projects/vps/sys/kern/imgact_elf.c
projects/vps/sys/kern/init_main.c
projects/vps/sys/kern/kern_acct.c
projects/vps/sys/kern/kern_clock.c
projects/vps/sys/kern/kern_conf.c
projects/vps/sys/kern/kern_cpuset.c
projects/vps/sys/kern/kern_descrip.c
projects/vps/sys/kern/kern_environment.c
projects/vps/sys/kern/kern_event.c
projects/vps/sys/kern/kern_exec.c
projects/vps/sys/kern/kern_exit.c
projects/vps/sys/kern/kern_fork.c
projects/vps/sys/kern/kern_jail.c
projects/vps/sys/kern/kern_khelp.c
projects/vps/sys/kern/kern_kthread.c
projects/vps/sys/kern/kern_ktrace.c
projects/vps/sys/kern/kern_linker.c
projects/vps/sys/kern/kern_mib.c
projects/vps/sys/kern/kern_module.c
projects/vps/sys/kern/kern_priv.c
projects/vps/sys/kern/kern_proc.c
projects/vps/sys/kern/kern_prot.c
projects/vps/sys/kern/kern_resource.c
projects/vps/sys/kern/kern_sharedpage.c
projects/vps/sys/kern/kern_shutdown.c
projects/vps/sys/kern/kern_sig.c
projects/vps/sys/kern/kern_switch.c
projects/vps/sys/kern/kern_synch.c
projects/vps/sys/kern/kern_sysctl.c
projects/vps/sys/kern/kern_tc.c
projects/vps/sys/kern/kern_thr.c
projects/vps/sys/kern/kern_thread.c
projects/vps/sys/kern/kern_time.c
projects/vps/sys/kern/kern_umtx.c
projects/vps/sys/kern/kern_uuid.c
projects/vps/sys/kern/posix4_mib.c
projects/vps/sys/kern/sched_ule.c
projects/vps/sys/kern/subr_kdb.c
projects/vps/sys/kern/subr_prf.c
projects/vps/sys/kern/subr_smp.c
projects/vps/sys/kern/subr_syscall.c
projects/vps/sys/kern/subr_trap.c
projects/vps/sys/kern/subr_turnstile.c
projects/vps/sys/kern/subr_witness.c
projects/vps/sys/kern/sys_generic.c
projects/vps/sys/kern/sys_process.c
projects/vps/sys/kern/sysv_msg.c
projects/vps/sys/kern/sysv_sem.c
projects/vps/sys/kern/sysv_shm.c
projects/vps/sys/kern/tty.c
projects/vps/sys/kern/tty_pts.c
projects/vps/sys/kern/tty_tty.c
projects/vps/sys/kern/uipc_socket.c
projects/vps/sys/kern/uipc_syscalls.c
projects/vps/sys/kern/vfs_bio.c
projects/vps/sys/kern/vfs_cache.c
projects/vps/sys/kern/vfs_cluster.c
projects/vps/sys/kern/vfs_export.c
projects/vps/sys/kern/vfs_mount.c
projects/vps/sys/kern/vfs_mountroot.c
projects/vps/sys/kern/vfs_subr.c
projects/vps/sys/kern/vfs_syscalls.c
projects/vps/sys/modules/Makefile
projects/vps/sys/net/bpf.c
projects/vps/sys/net/flowtable.c
projects/vps/sys/net/flowtable.h
projects/vps/sys/net/if.c
projects/vps/sys/net/if_llatbl.h
projects/vps/sys/net/if_tun.c
projects/vps/sys/net/if_var.h
projects/vps/sys/net/route.c
projects/vps/sys/net/rtsock.c
projects/vps/sys/net/vnet.c
projects/vps/sys/net/vnet.h
projects/vps/sys/netinet/in_proto.c
projects/vps/sys/netinet/in_rmx.c
projects/vps/sys/netinet/ip_divert.c
projects/vps/sys/netinet/ip_input.c
projects/vps/sys/netinet/raw_ip.c
projects/vps/sys/netinet/tcp_input.c
projects/vps/sys/netinet/tcp_output.c
projects/vps/sys/netinet/tcp_reass.c
projects/vps/sys/netinet/tcp_subr.c
projects/vps/sys/netinet/tcp_timewait.c
projects/vps/sys/netinet/tcp_usrreq.c
projects/vps/sys/netinet/udp_usrreq.c
projects/vps/sys/netinet6/in6.c
projects/vps/sys/netinet6/in6_ifattach.c
projects/vps/sys/netinet6/in6_proto.c
projects/vps/sys/netinet6/in6_rmx.c
projects/vps/sys/netinet6/ip6_input.c
projects/vps/sys/netinet6/nd6.c
projects/vps/sys/netinet6/nd6.h
projects/vps/sys/netinet6/nd6_nbr.c
projects/vps/sys/netinet6/nd6_rtr.c
projects/vps/sys/netpfil/ipfw/ip_fw_sockopt.c
projects/vps/sys/nfs/nfs_diskless.c
projects/vps/sys/nfs/nfs_lock.c
projects/vps/sys/nfsclient/nfs_vfsops.c
projects/vps/sys/nfsclient/nfs_vnops.c
projects/vps/sys/nfsserver/nfs_serv.c
projects/vps/sys/nlm/nlm_advlock.c
projects/vps/sys/ofed/include/linux/sysfs.h
projects/vps/sys/rpc/rpcsec_gss/svc_rpcsec_gss.c
projects/vps/sys/rpc/svc_auth.c
projects/vps/sys/sys/conf.h
projects/vps/sys/sys/eventhandler.h
projects/vps/sys/sys/jail.h
projects/vps/sys/sys/kernel.h
projects/vps/sys/sys/mount.h
projects/vps/sys/sys/msg.h
projects/vps/sys/sys/msgbuf.h
projects/vps/sys/sys/proc.h
projects/vps/sys/sys/resourcevar.h
projects/vps/sys/sys/sched.h
projects/vps/sys/sys/selinfo.h
projects/vps/sys/sys/sem.h
projects/vps/sys/sys/shm.h
projects/vps/sys/sys/sysctl.h
projects/vps/sys/sys/systm.h
projects/vps/sys/sys/time.h
projects/vps/sys/sys/tty.h
projects/vps/sys/sys/ucred.h
projects/vps/sys/vm/default_pager.c
projects/vps/sys/vm/phys_pager.c
projects/vps/sys/vm/swap_pager.c
projects/vps/sys/vm/uma.h
projects/vps/sys/vm/uma_core.c
projects/vps/sys/vm/vm.h
projects/vps/sys/vm/vm_fault.c
projects/vps/sys/vm/vm_glue.c
projects/vps/sys/vm/vm_kern.c
projects/vps/sys/vm/vm_map.c
projects/vps/sys/vm/vm_map.h
projects/vps/sys/vm/vm_meter.c
projects/vps/sys/vm/vm_mmap.c
projects/vps/sys/vm/vm_object.c
projects/vps/sys/vm/vm_page.c
projects/vps/sys/vm/vm_pageout.c
projects/vps/sys/vm/vm_pager.c
projects/vps/sys/vm/vm_pager.h
projects/vps/usr.sbin/Makefile
Modified: projects/vps/etc/mtree/BSD.include.dist
==============================================================================
--- projects/vps/etc/mtree/BSD.include.dist Thu Jun 27 00:51:47 2013 (r252286)
+++ projects/vps/etc/mtree/BSD.include.dist Thu Jun 27 00:56:09 2013 (r252287)
@@ -335,6 +335,8 @@
..
vm
..
+ vps
+ ..
xlocale
..
..
Modified: projects/vps/include/Makefile
==============================================================================
--- projects/vps/include/Makefile Thu Jun 27 00:51:47 2013 (r252286)
+++ projects/vps/include/Makefile Thu Jun 27 00:56:09 2013 (r252287)
@@ -39,7 +39,7 @@ LHDRS= aio.h errno.h fcntl.h linker_set.
LDIRS= bsm cam geom net net80211 netatalk netgraph netinet netinet6 \
netipsec ${_netipx} netnatm \
nfs nfsclient nfsserver \
- sys vm
+ sys vm vps
LSUBDIRS= cam/ata cam/scsi \
dev/acpica dev/agp dev/an dev/bktr dev/ciss dev/filemon dev/firewire \
Modified: projects/vps/sbin/Makefile
==============================================================================
--- projects/vps/sbin/Makefile Thu Jun 27 00:51:47 2013 (r252286)
+++ projects/vps/sbin/Makefile Thu Jun 27 00:56:09 2013 (r252287)
@@ -54,6 +54,7 @@ SUBDIR=adjkerntz \
mount_nullfs \
mount_udf \
mount_unionfs \
+ mount_vpsfs \
newfs \
newfs_msdos \
nfsiod \
Added: projects/vps/sbin/mount_vpsfs/Makefile
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ projects/vps/sbin/mount_vpsfs/Makefile Thu Jun 27 00:56:09 2013 (r252287)
@@ -0,0 +1,15 @@
+# @(#)Makefile 8.3 (Berkeley) 3/27/94
+# $FreeBSD: src/sbin/mount_vpsfs/Makefile,v 1.12.10.1.4.1 2010/06/14 02:09:06 kensmith Exp $
+
+PROG= mount_vpsfs
+SRCS= mount_vpsfs.c getmntopts.c
+MAN= mount_vpsfs.8
+BINDIR= /sbin
+
+MOUNT= ${.CURDIR}/../mount
+CFLAGS+= -I${MOUNT}
+WARNS?= 6
+
+.PATH: ${MOUNT}
+
+.include <bsd.prog.mk>
Added: projects/vps/sbin/mount_vpsfs/mount_vpsfs.8
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ projects/vps/sbin/mount_vpsfs/mount_vpsfs.8 Thu Jun 27 00:56:09 2013 (r252287)
@@ -0,0 +1,111 @@
+.\"
+.\" Copyright (c) 1992, 1993, 1994
+.\" The Regents of the University of California. All rights reserved.
+.\"
+.\" This code is derived from software donated to Berkeley by
+.\" John Heidemann of the UCLA Ficus project.
+.\"
+.\"
+.\" 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.
+.\" 4. Neither the name of the University 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 REGENTS 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 REGENTS 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.
+.\"
+.\" This used to be mount_nullfs(8).
+.\"
+.\" $Id: mount_vpsfs.8 120 2012-08-30 11:14:36Z klaus $
+.\"
+.Dd August 29, 2012
+.Dt MOUNT_VPSFS 8
+.Os
+.Sh NAME
+.Nm mount_vpsfs
+.Nd "mount a virtual filesystem layer for use with VPS"
+.Sh SYNOPSIS
+.Nm
+.Op Fl o Ar options
+.Ar target
+.Ar mount-point
+.Sh DESCRIPTION
+The
+.Nm
+utility mounts a virtual filesystem layer for use with
+.Xr vps 4 .
+This implements per-VPS-instance quotas and I/O throttling.
+.Pp
+It is based on
+.Xr mount_nullfs 8 .
+.Pp
+The options are as follows:
+.Bl -tag -width indent
+.It Fl o
+Options are specified with a
+.Fl o
+flag followed by a comma separated string of options.
+See the
+.Xr mount 8
+man page for possible options and their meanings.
+.El
+.\"
+.\"
+.\"
+.\"
+.\"
+.\"
+.Sh SEE ALSO
+.Xr mount 8
+.Xr vpsctl 8 ,
+.Xr vps 4 ,
+.Xr vps 9 ,
+.Xr vps.conf 5 ,
+.Ad http://www.7he.at/freebsd/vps/
+.\"
+.\"
+.\" .Sh STANDARDS
+.\"
+.\"
+.Sh HISTORY
+Work on VPS was started in February 2009.
+.\"
+.\"
+.Sh AUTHORS
+.Pp
+Virtual Private Systems for FreeBSD and this manual page as well,
+were written by
+.An "Klaus P. Ohrhallinger" .
+.Pp
+Development of this software was partly funded by:
+.Pp
+TransIP.nl <http://www.transip.nl/>
+.\"
+.\"
+.Sh BUGS
+VPS is in an early stage of development and has to be considered as
+experimental.
+This means many bugs have to be expected.
+.Pp
+Please submit bug reports to
+.Ad freebsd-vps at 7he.at .
+.\"
+.\"
+.Sh VERSION
+$Id: mount_vpsfs.8 120 2012-08-30 11:14:36Z klaus $
Added: projects/vps/sbin/mount_vpsfs/mount_vpsfs.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ projects/vps/sbin/mount_vpsfs/mount_vpsfs.c Thu Jun 27 00:56:09 2013 (r252287)
@@ -0,0 +1,139 @@
+/*
+ * Copyright (c) 1992, 1993, 1994
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software donated to Berkeley by
+ * Jan-Simon Pendry.
+ *
+ * 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.
+ * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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.
+ */
+
+#ifndef lint
+static const char copyright[] =
+"@(#) Copyright (c) 1992, 1993, 1994\n\
+ The Regents of the University of California. All rights reserved.\n";
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)mount_null.c 8.6 (Berkeley) 4/26/95";
+#endif
+static const char rcsid[] =
+ "$FreeBSD: src/sbin/mount_nullfs/mount_nullfs.c,v 1.26.10.1.4.1 2010/06/14 02:09:06 kensmith Exp $";
+#endif /* not lint */
+
+#include <sys/param.h>
+#include <sys/mount.h>
+#include <sys/uio.h>
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sysexits.h>
+#include <unistd.h>
+
+#include "mntopts.h"
+
+static struct mntopt mopts[] = {
+ MOPT_STDOPTS,
+ MOPT_END
+};
+
+int subdir(const char *, const char *);
+static void usage(void) __dead2;
+
+int
+main(int argc, char *argv[])
+{
+ struct iovec iov[6];
+ int ch, mntflags;
+ char source[MAXPATHLEN];
+ char target[MAXPATHLEN];
+
+ mntflags = 0;
+ while ((ch = getopt(argc, argv, "o:")) != -1)
+ switch(ch) {
+ case 'o':
+ getmntopts(optarg, mopts, &mntflags, 0);
+ break;
+ case '?':
+ default:
+ usage();
+ }
+ argc -= optind;
+ argv += optind;
+
+ if (argc != 2)
+ usage();
+
+ /* resolve target and source with realpath(3) */
+ (void)checkpath(argv[0], target);
+ (void)checkpath(argv[1], source);
+
+ if (subdir(target, source) || subdir(source, target))
+ errx(EX_USAGE, "%s (%s) and %s are not distinct paths",
+ argv[0], target, argv[1]);
+
+ iov[0].iov_base = strdup("fstype");
+ iov[0].iov_len = sizeof("fstype");
+ iov[1].iov_base = strdup("vpsfs");
+ iov[1].iov_len = strlen(iov[1].iov_base) + 1;
+ iov[2].iov_base = strdup("fspath");
+ iov[2].iov_len = sizeof("fspath");
+ iov[3].iov_base = source;
+ iov[3].iov_len = strlen(source) + 1;
+ iov[4].iov_base = strdup("target");
+ iov[4].iov_len = sizeof("target");
+ iov[5].iov_base = target;
+ iov[5].iov_len = strlen(target) + 1;
+
+ if (nmount(iov, 6, mntflags))
+ err(1, NULL);
+ exit(0);
+}
+
+int
+subdir(const char *p, const char *dir)
+{
+ int l;
+
+ l = strlen(dir);
+ if (l <= 1)
+ return (1);
+
+ if ((strncmp(p, dir, l) == 0) && (p[l] == '/' || p[l] == '\0'))
+ return (1);
+
+ return (0);
+}
+
+static void
+usage(void)
+{
+ (void)fprintf(stderr,
+ "usage: mount_vpsfs [-o options] target mount-point\n");
+ exit(1);
+}
Modified: projects/vps/sys/Makefile
==============================================================================
--- projects/vps/sys/Makefile Thu Jun 27 00:51:47 2013 (r252286)
+++ projects/vps/sys/Makefile Thu Jun 27 00:56:09 2013 (r252287)
@@ -12,7 +12,7 @@ CSCOPEDIRS= boot bsm cam cddl compat con
geom gnu isa kern libkern modules net net80211 netatalk \
netgraph netinet netinet6 netipsec netipx netnatm \
netsmb nfs nfsclient nfsserver nlm ofed opencrypto \
- pci rpc security sys ufs vm xdr xen ${CSCOPE_ARCHDIR}
+ pci rpc security sys ufs vm vps xdr xen ${CSCOPE_ARCHDIR}
.if !defined(CSCOPE_ARCHDIR)
.if defined(ALL_ARCH)
CSCOPE_ARCHDIR = amd64 arm i386 ia64 mips pc98 powerpc sparc64 x86
Modified: projects/vps/sys/amd64/amd64/exception.S
==============================================================================
--- projects/vps/sys/amd64/amd64/exception.S Thu Jun 27 00:51:47 2013 (r252286)
+++ projects/vps/sys/amd64/amd64/exception.S Thu Jun 27 00:56:09 2013 (r252287)
@@ -350,6 +350,9 @@ IDTVEC(fast_syscall)
/* Now emulate a trapframe. Make the 8 byte alignment odd for call. */
subq $TF_SIZE,%rsp
/* defer TF_RSP till we have a spare register */
+#ifdef VPS
+ movq $0x80,TF_TRAPNO(%rsp)
+#endif
movq %r11,TF_RFLAGS(%rsp)
movq %rcx,TF_RIP(%rsp) /* %rcx original value is in %r10 */
movq PCPU(SCRATCH_RSP),%r11 /* %r11 already saved */
Modified: projects/vps/sys/amd64/amd64/identcpu.c
==============================================================================
--- projects/vps/sys/amd64/amd64/identcpu.c Thu Jun 27 00:51:47 2013 (r252286)
+++ projects/vps/sys/amd64/amd64/identcpu.c Thu Jun 27 00:56:09 2013 (r252287)
@@ -98,8 +98,8 @@ sysctl_hw_machine(SYSCTL_HANDLER_ARGS)
return (error);
}
-SYSCTL_PROC(_hw, HW_MACHINE, machine, CTLTYPE_STRING | CTLFLAG_RD,
- NULL, 0, sysctl_hw_machine, "A", "Machine class");
+_SYSCTL_PROC(_hw, HW_MACHINE, machine, CTLTYPE_STRING | CTLFLAG_RD,
+ NULL, 0, sysctl_hw_machine, "A", "Machine class", VPS_PUBLIC);
static char cpu_model[128];
SYSCTL_STRING(_hw, HW_MODEL, model, CTLFLAG_RD,
Modified: projects/vps/sys/amd64/amd64/pmap.c
==============================================================================
--- projects/vps/sys/amd64/amd64/pmap.c Thu Jun 27 00:51:47 2013 (r252286)
+++ projects/vps/sys/amd64/amd64/pmap.c Thu Jun 27 00:56:09 2013 (r252287)
@@ -122,6 +122,8 @@ __FBSDID("$FreeBSD$");
#include <sys/cpuset.h>
#endif
+#include <vps/vps_account.h>
+
#include <vm/vm.h>
#include <vm/vm_param.h>
#include <vm/vm_kern.h>
@@ -165,6 +167,24 @@ __FBSDID("$FreeBSD$");
#define pa_index(pa) ((pa) >> PDRSHIFT)
#define pa_to_pvh(pa) (&pv_table[pa_index(pa)])
+#if 0
+
+#ifdef VPS
+#define VPS_ACCOUNT_PMAP(_pmap, action, charge) \
+ do { \
+ if (_pmap == kernel_map->pmap || \
+ _pmap == kmem_map->pmap || \
+ _pmap == buffer_map->pmap) \
+ break; \
+ vps_account(curthread->td_vps, VPS_ACC_PHYS, \
+ action, charge << PAGE_SHIFT); \
+ } while (0)
+#endif /* VPS */
+
+#else
+#define VPS_ACCOUNT_PMAP(a, b, c)
+#endif
+
#define NPV_LIST_LOCKS MAXCPU
#define PHYS_TO_PV_LIST_LOCK(pa) \
@@ -461,6 +481,7 @@ pmap_resident_count_inc(pmap_t pmap, int
PMAP_LOCK_ASSERT(pmap, MA_OWNED);
pmap->pm_stats.resident_count += count;
+ VPS_ACCOUNT_PMAP(pmap, VPS_ACC_ALLOC, count);
}
static __inline void
@@ -469,6 +490,7 @@ pmap_resident_count_dec(pmap_t pmap, int
PMAP_LOCK_ASSERT(pmap, MA_OWNED);
pmap->pm_stats.resident_count -= count;
+ VPS_ACCOUNT_PMAP(pmap, VPS_ACC_FREE, count);
}
PMAP_INLINE pt_entry_t *
Modified: projects/vps/sys/amd64/amd64/trap.c
==============================================================================
--- projects/vps/sys/amd64/amd64/trap.c Thu Jun 27 00:51:47 2013 (r252286)
+++ projects/vps/sys/amd64/amd64/trap.c Thu Jun 27 00:56:09 2013 (r252287)
@@ -656,6 +656,9 @@ trap_pfault(frame, usermode)
struct proc *p = td->td_proc;
vm_offset_t eva = frame->tf_addr;
+ ftype = 0;
+ map = NULL;
+
if (__predict_false((td->td_pflags & TDP_NOFAULTING) != 0)) {
/*
* Due to both processor errata and lazy TLB invalidation when
@@ -789,7 +792,11 @@ nogo:
}
trap_fatal(frame, eva);
return (-1);
+ } else {
+ printf("%s: proc=%p/%d map=%p eva=%016lx prot=%x rv=%d\n",
+ __func__, p, p->p_pid, map, eva, ftype, rv);
}
+
return ((rv == KERN_PROTECTION_FAILURE) ? SIGBUS : SIGSEGV);
}
Added: projects/vps/sys/amd64/amd64/vps_machdep.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ projects/vps/sys/amd64/amd64/vps_machdep.c Thu Jun 27 00:56:09 2013 (r252287)
@@ -0,0 +1,538 @@
+/*-
+ * Copyright (c) 2009-2013 Klaus P. Ohrhallinger <k at 7he.at>
+ * All rights reserved.
+ *
+ * Development of this software was partly funded by:
+ * TransIP.nl <http://www.transip.nl/>
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+ */
+
+static const char vpsid[] =
+ "$Id$";
+
+#include <sys/cdefs.h>
+
+#include <sys/param.h>
+#include <sys/conf.h>
+#include <sys/types.h>
+#include <sys/kernel.h>
+#include <sys/libkern.h>
+#include <sys/malloc.h>
+#include <sys/proc.h>
+#include <sys/sysent.h>
+#include <sys/sysproto.h>
+
+#include <machine/cputypes.h>
+#include <machine/cpu.h>
+#include <machine/pcb.h>
+#include <machine/frame.h>
+#include <machine/vmparam.h>
+#include <machine/vps_md.h>
+
+#include <vm/vm.h>
+#include <vm/pmap.h>
+#include <vm/vm_page.h>
+#include <vm/vm_object.h>
+#include <vm/vm_map.h>
+
+#include <vps/vps.h>
+#include <vps/vps2.h>
+#include <vps/vps_int.h>
+#include <vps/vps_libdump.h>
+#include <vps/vps_snapst.h>
+
+#ifdef VPS
+
+/*__attribute__((inline))*/
+void
+vps_md_print_thread(struct thread *td)
+{
+
+ DBGCORE("%s: thread %p/%d kernel stack:\n"
+ "td->td_pcb->rsp=%016lx\n"
+ "td->td_frame->tf_rax=%016lx\n"
+ "td->td_frame->tf_rsp=%016lx\n"
+ "td->td_frame->tf_rbp=%016lx\n"
+ "td->td_frame->tf_rip=%016lx\n"
+ "trace:\n",
+ __func__,
+ td,
+ td->td_tid,
+ td->td_pcb->pcb_rsp,
+ td->td_frame->tf_rax,
+ td->td_frame->tf_rsp,
+ td->td_frame->tf_rbp,
+ td->td_frame->tf_rip);
+}
+
+/*__attribute__((inline))*/
+int
+vps_md_restore_thread(struct vps_dump_thread *vdtd, struct thread *ntd,
+ struct proc *p)
+{
+
+ if (vps_func->vps_restore_return == NULL) {
+ printf("%s: vps_restore module not loaded ? "
+ "vps_func->vps_restore_return == NULL",
+ __func__);
+ return (EOPNOTSUPP);
+ }
+
+ ntd->td_pcb->pcb_cr3 =
+ DMAP_TO_PHYS((vm_offset_t)vmspace_pmap(p->p_vmspace)->pm_pml4);
+ ntd->td_pcb->pcb_r12 = (uint64_t)vps_func->vps_restore_return;
+ ntd->td_pcb->pcb_rbp = 0;
+ ntd->td_pcb->pcb_rsp = (uint64_t)ntd->td_frame - sizeof(void *);
+ ntd->td_pcb->pcb_rbx = (uint64_t)ntd;
+ ntd->td_pcb->pcb_rip = (uint64_t)fork_trampoline;
+ ntd->td_md.md_spinlock_count = 1;
+ ntd->td_md.md_saved_flags = PSL_KERNEL | PSL_I;
+ ntd->td_errno = vdtd->td_errno;
+ ntd->td_retval[0] = vdtd->td_retval[0];
+ ntd->td_retval[1] = vdtd->td_retval[1];
+
+ //db_trace_thread(ntd, 10);
+ DBGCORE("%s: td_pcb = %p; td_frame = %p; pcb_rsp = %016lx\n",
+ __func__, ntd->td_pcb, ntd->td_frame, ntd->td_pcb->pcb_rsp);
+
+ return (0);
+}
+
+/*__attribute__((inline))*/
+int
+vps_md_snapshot_sysentvec(struct sysentvec *sv, long *svtype)
+{
+ int error = 0;
+
+ if (sv == &elf64_freebsd_sysvec) {
+ DBGCORE("%s: elf64_freebsd_sysvec\n", __func__);
+ *svtype = VPS_SYSENTVEC_ELF64;
+#ifdef COMPAT_FREEBSD32
+ } else if (sv == &ia32_freebsd_sysvec) {
+ DBGCORE("%s: ia32_freebsd_sysvec\n", __func__);
+ *svtype = VPS_SYSENTVEC_ELF32;
+#endif
+ } else if (sv == &null_sysvec) {
+ DBGCORE("%s: null_sysvec\n", __func__);
+ *svtype = VPS_SYSENTVEC_NULL;
+ } else {
+ DBGCORE("%s: unknown sysentvec %p\n", __func__, sv);
+ error = EINVAL;
+ }
+
+ return (error);
+}
+
+/*__attribute__((inline))*/
+int
+vps_md_restore_sysentvec(long svtype, struct sysentvec **sv)
+{
+ int error = 0;
+
+ if (svtype == VPS_SYSENTVEC_ELF64)
+ *sv = &elf64_freebsd_sysvec;
+#ifdef COMPAT_FREEBSD32
+ else if (svtype == VPS_SYSENTVEC_ELF32)
+ *sv = &ia32_freebsd_sysvec;
+#endif
+ else if (svtype == VPS_SYSENTVEC_NULL)
+ *sv = &null_sysvec;
+ else {
+ DBGCORE("%s: unknown sysentvec type: %ld\n",
+ __func__, svtype);
+ error = EINVAL;
+ }
+
+ return (error);
+}
+
+/*__attribute__((inline))*/
+int
+vps_md_restore_checkarch(uint8 ptrsize, uint8 byteorder)
+{
+ int error;
+
+ if (ptrsize == VPS_DUMPH_64BIT && byteorder == VPS_DUMPH_LSB)
+ error = 0;
+ else
+ error = EINVAL;
+
+ return (error);
+}
+
+/*__attribute__((inline))*/
+int
+vps_md_snapshot_thread_savefpu(struct vps_snapst_ctx *ctx, struct vps *vps,
+ struct thread *td)
+{
+ struct vps_dumpobj *o1;
+ struct vps_dump_savefpu *vdsf;
+
+ KASSERT(td->td_pcb != NULL && td->td_pcb->pcb_save != NULL,
+ ("%s: td->td_pcb == NULL || td->td_pcb->pcb_save == NULL\n",
+ __func__));
+
+ if ((o1 = vdo_create(ctx, VPS_DUMPOBJT_SAVEFPU, M_NOWAIT)) ==
+ NULL) {
+ vdo_discard(ctx, o1);
+ return (ENOMEM);
+ }
+
+ if ((vdsf = vdo_space(ctx, sizeof(*vdsf), M_NOWAIT)) == NULL) {
+ vdo_discard(ctx, o1);
+ return (ENOMEM);
+ }
+ vdsf->sf_length = sizeof(struct savefpu);
+
+ if (vdo_append(ctx, (void *)td->td_pcb->pcb_save, vdsf->sf_length,
+ M_NOWAIT)) {
+ vdo_discard(ctx, o1);
+ return (ENOMEM);
+ }
+
+ vdo_close(ctx);
+
+ return (0);
+}
+
+/*__attribute__((inline))*/
+int
+vps_md_restore_thread_savefpu(struct vps_snapst_ctx *ctx, struct vps *vps,
+ struct thread *td)
+{
+ struct vps_dumpobj *o1;
+ struct vps_dump_savefpu *vdsf;
+
+ /* caller verified type. */
+ o1 = vdo_next(ctx);
+
+ vdsf = (struct vps_dump_savefpu *)o1->data;
+
+ /*
+ * XXX Verify that we can't harm the system (kernel space)
+ * by restoring an invalid savefpu context.
+ */
+ if (vdsf->sf_length != sizeof(struct savefpu)) {
+ DBGCORE("%s: vdsf->sf_length != sizeof(struct savefpu) "
+ "(%u != %lu)\n", __func__, vdsf->sf_length,
+ sizeof(struct savefpu));
+ return (EINVAL);
+ }
+
+ KASSERT(td->td_pcb != NULL && td->td_pcb->pcb_save != NULL,
+ ("%s: td->td_pcb == NULL || td->td_pcb->pcb_save == NULL\n",
+ __func__));
+
+ DBGCORE("%s: td->td_pcb->pcb_save=%p\n",
+ __func__, td->td_pcb->pcb_save);
+ memcpy(td->td_pcb->pcb_save, vdsf->sf_data, vdsf->sf_length);
+
+ return (0);
+}
+
+/*__attribute__((inline))*/
+int
+vps_md_reboot_copyout(struct thread *td, struct execve_args *args)
+{
+ vm_offset_t addr;
+ struct proc *p;
+ int error = 0;
+
+ /*
+ * We push the arguments to execve() onto the
+ * userspace stack of our process.
+ */
+ p = td->td_proc;
+ addr = p->p_sysent->sv_usrstack - PAGE_SIZE;
+ if (p->p_vmspace->vm_ssize < 1 /* page */) {
+ /* Should not ever happen in theory ! */
+ return (ENOSPC);
+ }
+
+ if (p->p_sysent == &elf64_freebsd_sysvec) {
+ copyout("/sbin/init", (void *)(addr + 0x40), 11);
+ suword64((void *)(addr + 0x0), (addr + 0x40));
+ suword64((void *)(addr + 0x8), (vm_offset_t)NULL);
+#ifdef COMPAT_FREEBSD32
+ } else if (p->p_sysent == &ia32_freebsd_sysvec) {
+ copyout("/sbin/init", (void *)(addr + 0x40), 11);
+ suword32((void *)(addr + 0x0), (addr + 0x40));
+ suword32((void *)(addr + 0x4), (vm_offset_t)NULL);
+#endif
+ } else {
+ error = EINVAL;
+ }
+
+ args->fname = (char *)(addr + 0x40);
+ args->argv = (char **)addr;
+ args->envv = NULL;
+
+#if 0
+// notyet
+ KASSERT(pargs != NULL,
+ ("%s: vps=%p, lost pargs somewhere, don't know what to boot\n",
+ __func__, vps));
+ arglen = pargs->ar_length;
+ /*
+ if (arglen > PAGE_SIZE)
+ arglen = PAGE_SIZE - 1;
+ copyout(pargs->ar_args, (void *)addr, arglen);
+ subyte((char *)(addr + PAGE_SIZE - 1), 0x0);
+ */
+ if (exec_alloc_args(&imgargs)) {
+ DBGCORE("%s: exec_alloc_args() returned error\n", __func__);
+ pargs_drop(pargs);
+ goto fail;
+ }
+ if (arglen > PATH_MAX + ARG_MAX)
+ arglen = PATH_MAX + ARG_MAX - 1;
+ memcpy(imgargs.buf, pargs->ar_args, arglen);
+ addr = (vm_offset_t)imgargs.buf;
+ // ---
+ imgargs.fname = (char *)addr;
+ imgargs.begin_argv = (char *)(addr + 0x0);
+ imgargs.begin_envv = (char *)(addr + arglen);
+ imgargs.endp = (char *)(addr + arglen);
+ imgargs.envc = 0;
+ imgargs.argc = 1; /* XXX */
+ imgargs.stringspace = 0;
+#endif
+
+ return (error);
+}
+
+/*__attribute__((noinline))*/
+int
+vps_md_syscall_fixup(struct vps *vps, struct thread *td,
+ register_t *ret_code, register_t **ret_args, int *ret_narg)
+{
+ struct trapframe *frame;
+ struct sysentvec *sv;
+ struct proc *p;
+ caddr_t params;
+ register_t code;
+ register_t args[8];
+ int narg;
+ int error = 0;
+ int i;
+ int ia32_emul = 0;
+ struct ucred *save_ucred = curthread->td_ucred;
+
+ if (vps_func->vps_access_vmspace == NULL)
+ return (EOPNOTSUPP);
+
+ p = td->td_proc;
+ frame = td->td_frame;
+ sv = p->p_sysent;
+
+ if (frame->tf_trapno != 0x80) {
+ DBGCORE("%s: thread %p was not in syscall: "
+ "tf_trapno=0x%x tf_rip=%p\n", __func__, td,
+ frame->tf_trapno, (void*)frame->tf_rip);
+
+ /* nothing to do ? */
+ error = 0;
+ goto out;
+ }
+
+ if (sv == &elf64_freebsd_sysvec) {
+ DBGCORE("%s: proc=%p/%u elf64_freebsd_sysvec\n",
+ __func__, p, p->p_pid);
+#ifdef COMPAT_FREEBSD32
+ } else if (sv == &ia32_freebsd_sysvec) {
+ DBGCORE("%s: proc=%p/%u ia32_freebsd_sysvec\n",
+ __func__, p, p->p_pid);
+ ia32_emul = 1;
+#endif
+ } else {
+ DBGCORE("%s: proc=%p/%u unknown sysentvec %p\n",
+ __func__, p, p->p_pid, sv);
+ panic("%s: proc=%p/%u unknown sysentvec %p\n",
+ __func__, p, p->p_pid, sv);
+ }
+
+ /* Just in case vm objects are split/copied/... */
+ curthread->td_ucred = td->td_ucred;
+
+ /*
+ * XXX: special handling for
+ * sa->code == SYS_syscall || sa->code == SYS___syscall
+ */
+
+ memset((caddr_t)args, 0, sizeof(args));
+
+ code = frame->tf_rax;
+
+ if (sv->sv_mask)
+ code &= sv->sv_mask;
+ if (code >= sv->sv_size)
+ code = 0;
+
+ narg = (&sv->sv_table[code])->sy_narg;
+
+ KASSERT(narg * sizeof(register_t) <= sizeof(args),
+ ("%s: argument space on stack too small, narg=%d\n",
+ __func__, narg));
+
+ if (ia32_emul) {
+ uint32_t args32[8];
+
+ memset(args32, 0, sizeof(args32));
+
+ params = (caddr_t)frame->tf_rsp + sizeof(uint32_t);
+
+ if (params != NULL && narg > 0)
+ if ((vps_func->vps_access_vmspace(p->p_vmspace,
+ (vm_offset_t)params, narg * sizeof(uint32_t),
+ (caddr_t)args32, VM_PROT_READ))) {
+ error = EFAULT;
+ goto out;
+ }
+
+ for (i = 0; i < narg; i++)
+ args[i] = (uint64_t)args32[i];
+
+ } else {
+
+ params = (caddr_t)frame->tf_rsp + sizeof(register_t);
+
+ args[0] = frame->tf_rdi;
+ args[1] = frame->tf_rsi;
+ args[2] = frame->tf_rdx;
+ args[3] = frame->tf_rcx;
+ args[4] = frame->tf_r8;
+ args[5] = frame->tf_r9;
+
+ for (i = 0; i < 6; i++)
+ if (i >= narg)
+ args[i] = 0;
+
+ /* XXX only need this in case narg > regcnt (6 on amd64)
+ if ((vps_func->vps_access_vmspace(p->p_vmspace,
+ (vm_offset_t)params, narg * sizeof(register_t),
+ (caddr_t)args, VM_PROT_READ))) {
+ error = EFAULT;
+ goto out;
+ }
+ */
+
+ }
+
+ DBGCORE("%s: code=%lu/0x%lx narg=%u args: %016lx %016lx %016lx "
+ "%016lx %016lx %016lx\n", __func__, code, code, narg,
+ args[0], args[1], args[2], args[3], args[4], args[5]);
+
+ DBGCORE("SYSCALL: tid=%d pid=%d syscall=%ld retval[0]=%zx "
+ "retval[1]=%zx errno=%d\n",
+ td->td_tid, td->td_proc->p_pid, code, td->td_retval[0],
+ td->td_retval[1], td->td_errno);
+
+ KASSERT(*ret_narg >= narg,
+ ("%s: supplied args array too small (narg=%d *ret_narg=%d)\n",
+ __func__, narg, *ret_narg));
+ *ret_code = code;
+ *ret_narg= narg;
+ memcpy(ret_args, &args, narg * sizeof(args[0]));
+
+ out:
+ curthread->td_ucred = save_ucred;
+
+ return (error);
+}
+
+int
+vps_md_syscall_fixup_setup_inthread(struct vps *vps, struct thread *td,
+ register_t code)
+{
+
+ DBGCORE("%s\n", __func__);
+
+ if (vps_func->vps_syscall_fixup_inthread == NULL)
+ return (EOPNOTSUPP);
+
+ td->td_pcb->pcb_r12 =
+ (uint64_t)vps_func->vps_syscall_fixup_inthread;
+ td->td_pcb->pcb_rip = (uint64_t)fork_trampoline;
+ td->td_pcb->pcb_rsp = (uint64_t)td->td_frame -
+ sizeof(void *);
+ td->td_pcb->pcb_rbx = (uint64_t)code;
+ td->td_pcb->pcb_rbp = 0;
+
+ return (0);
+}
+
+__attribute__((noinline))
+void
+vps_md_print_pcb(struct thread *td)
+{
+ struct pcb *p;
+
+ p = td->td_pcb;
+
+#if 0
+// XXX
+ DBGCORE("%s: td=%p\n"
+ "pcb_cr3: 0x%08x\n"
+ "pcb_edi: 0x%08x\n"
+ "pcb_esi: 0x%08x\n"
+ "pcb_ebp: 0x%08x\n"
+ "pcb_esp: 0x%08x\n"
+ "pcb_ebx: 0x%08x\n"
+ "pcb_eip: 0x%08x\n"
+ "pcb_psl: 0x%08x\n"
+ "pcb_ext: 0x%08x\n"
+ , __func__, td
+ , p->pcb_cr3
+ , p->pcb_edi
+ , p->pcb_esi
+ , p->pcb_ebp
+ , p->pcb_esp
+ , p->pcb_ebx
+ , p->pcb_eip
+ , p->pcb_psl
+ , (int)p->pcb_ext
+ );
+#endif
+}
+
+#if 0
+/* --------------------------- 8< --------------------------- */
+
+// vps_suspend():
+#if defined(CPU_X86)
+ DBGCORE("td->td_frame=%p tf_rax=%p tf_rsp=%p\n", td->td_frame,
+ (void*)td->td_frame->tf_rax, (void*)td->td_frame->tf_rsp);
+#elif defined(CPU_386)
+ DBGCORE("td->td_frame=%p tf_eax=%p tf_esp=%p\n", td->td_frame,
+ (void*)td->td_frame->tf_eax, (void*)td->td_frame->tf_esp);
+#else
+#error "unsupported architecture"
+#endif
+
+//
+/* --------------------------- 8< --------------------------- */
+#endif /* 0 */
+
+#endif /* VPS */
+
+/* EOF */
Modified: projects/vps/sys/amd64/ia32/ia32_exception.S
==============================================================================
--- projects/vps/sys/amd64/ia32/ia32_exception.S Thu Jun 27 00:51:47 2013 (r252286)
+++ projects/vps/sys/amd64/ia32/ia32_exception.S Thu Jun 27 00:56:09 2013 (r252287)
@@ -44,6 +44,9 @@ IDTVEC(int0x80_syscall)
swapgs
pushq $2 /* sizeof "int 0x80" */
subq $TF_ERR,%rsp /* skip over tf_trapno */
+#ifdef VPS
+ movl $0x80,TF_TRAPNO(%rsp)
+#endif
movq %rdi,TF_RDI(%rsp)
movq PCPU(CURPCB),%rdi
andl $~PCB_FULL_IRET,PCB_FLAGS(%rdi)
Added: projects/vps/sys/amd64/include/vps_md.h
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ projects/vps/sys/amd64/include/vps_md.h Thu Jun 27 00:56:09 2013 (r252287)
@@ -0,0 +1,65 @@
+/*-
+ * Copyright (c) 2009-2013 Klaus P. Ohrhallinger <k at 7he.at>
+ * All rights reserved.
+ *
+ * Development of this software was partly funded by:
+ * TransIP.nl <http://www.transip.nl/>
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-projects
mailing list