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