From owner-svn-src-projects@FreeBSD.ORG Thu Jun 27 00:56:13 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 4FDA0E7B; Thu, 27 Jun 2013 00:56:13 +0000 (UTC) (envelope-from will@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id 3F47F1A05; Thu, 27 Jun 2013 00:56:13 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r5R0uCE8030346; Thu, 27 Jun 2013 00:56:12 GMT (envelope-from will@svn.freebsd.org) Received: (from will@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r5R0uAev030330; Thu, 27 Jun 2013 00:56:10 GMT (envelope-from will@svn.freebsd.org) Message-Id: <201306270056.r5R0uAev030330@svn.freebsd.org> From: Will Andrews Date: Thu, 27 Jun 2013 00:56:10 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: 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... X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 27 Jun 2013 00:56:13 -0000 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 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 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 +.\" +.\" +.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@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 +#include +#include + +#include +#include +#include +#include +#include +#include + +#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 #endif +#include + #include #include #include @@ -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 + * All rights reserved. + * + * Development of this software was partly funded by: + * 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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#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 + * All rights reserved. + * + * Development of this software was partly funded by: + * 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 ***