Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 19 Mar 2013 16:33:43 +0000 (UTC)
From:      Attilio Rao <attilio@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r248524 - in user/attilio/vmcontention: contrib/binutils/gas/config crypto/openssh etc/mtree etc/rc.d lib/libc/sys lib/libvmmapi sbin/geom/class/eli sbin/ldconfig share/examples share/e...
Message-ID:  <201303191633.r2JGXhtX057604@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: attilio
Date: Tue Mar 19 16:33:43 2013
New Revision: 248524
URL: http://svnweb.freebsd.org/changeset/base/248524

Log:
  MFC

Added:
  user/attilio/vmcontention/share/examples/bhyve/
     - copied from r248523, head/share/examples/bhyve/
Modified:
  user/attilio/vmcontention/contrib/binutils/gas/config/tc-arm.c
  user/attilio/vmcontention/crypto/openssh/sshd_config
  user/attilio/vmcontention/etc/mtree/BSD.usr.dist
  user/attilio/vmcontention/etc/rc.d/savecore
  user/attilio/vmcontention/lib/libc/sys/mlock.2
  user/attilio/vmcontention/lib/libvmmapi/vmmapi.c
  user/attilio/vmcontention/lib/libvmmapi/vmmapi.h
  user/attilio/vmcontention/sbin/geom/class/eli/geom_eli.c
  user/attilio/vmcontention/sbin/ldconfig/ldconfig.8
  user/attilio/vmcontention/share/examples/Makefile
  user/attilio/vmcontention/share/man/man4/iwn.4
  user/attilio/vmcontention/share/man/man4/psm.4
  user/attilio/vmcontention/sys/amd64/amd64/pmap.c
  user/attilio/vmcontention/sys/arm/arm/pmap-v6.c
  user/attilio/vmcontention/sys/arm/arm/pmap.c
  user/attilio/vmcontention/sys/arm/include/bus.h
  user/attilio/vmcontention/sys/cam/ata/ata_da.c
  user/attilio/vmcontention/sys/cam/cam_ccb.h
  user/attilio/vmcontention/sys/cam/cam_periph.c
  user/attilio/vmcontention/sys/cam/scsi/scsi_all.c
  user/attilio/vmcontention/sys/cam/scsi/scsi_all.h
  user/attilio/vmcontention/sys/cam/scsi/scsi_cd.c
  user/attilio/vmcontention/sys/cam/scsi/scsi_da.c
  user/attilio/vmcontention/sys/cddl/compat/opensolaris/sys/sig.h
  user/attilio/vmcontention/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
  user/attilio/vmcontention/sys/dev/ahci/ahci.c
  user/attilio/vmcontention/sys/dev/atkbdc/psm.c
  user/attilio/vmcontention/sys/dev/fdt/fdt_common.c
  user/attilio/vmcontention/sys/dev/fdt/fdtbus.c
  user/attilio/vmcontention/sys/dev/fdt/simplebus.c
  user/attilio/vmcontention/sys/dev/md/md.c
  user/attilio/vmcontention/sys/dev/puc/pucdata.c
  user/attilio/vmcontention/sys/dev/siis/siis.c
  user/attilio/vmcontention/sys/dev/usb/serial/u3g.c
  user/attilio/vmcontention/sys/dev/usb/usbdevs
  user/attilio/vmcontention/sys/fs/nfsclient/nfs_clbio.c
  user/attilio/vmcontention/sys/geom/geom.h
  user/attilio/vmcontention/sys/geom/geom_disk.c
  user/attilio/vmcontention/sys/geom/geom_disk.h
  user/attilio/vmcontention/sys/geom/geom_io.c
  user/attilio/vmcontention/sys/geom/geom_vfs.c
  user/attilio/vmcontention/sys/geom/part/g_part.c
  user/attilio/vmcontention/sys/i386/i386/pmap.c
  user/attilio/vmcontention/sys/i386/xen/pmap.c
  user/attilio/vmcontention/sys/ia64/ia64/pmap.c
  user/attilio/vmcontention/sys/kern/kern_physio.c
  user/attilio/vmcontention/sys/kern/kern_sig.c
  user/attilio/vmcontention/sys/kern/kern_synch.c
  user/attilio/vmcontention/sys/kern/subr_bus_dma.c
  user/attilio/vmcontention/sys/kern/subr_param.c
  user/attilio/vmcontention/sys/kern/subr_sleepqueue.c
  user/attilio/vmcontention/sys/kern/subr_trap.c
  user/attilio/vmcontention/sys/kern/vfs_aio.c
  user/attilio/vmcontention/sys/kern/vfs_bio.c
  user/attilio/vmcontention/sys/kern/vfs_cluster.c
  user/attilio/vmcontention/sys/mips/mips/pmap.c
  user/attilio/vmcontention/sys/modules/dtrace/fbt/Makefile
  user/attilio/vmcontention/sys/net/pfil.c
  user/attilio/vmcontention/sys/net/pfil.h
  user/attilio/vmcontention/sys/netpfil/ipfw/ip_fw2.c
  user/attilio/vmcontention/sys/netpfil/ipfw/ip_fw_private.h
  user/attilio/vmcontention/sys/nfsclient/nfs_bio.c
  user/attilio/vmcontention/sys/powerpc/aim/mmu_oea64.c
  user/attilio/vmcontention/sys/powerpc/powerpc/pmap_dispatch.c
  user/attilio/vmcontention/sys/sparc64/sparc64/pmap.c
  user/attilio/vmcontention/sys/sys/bio.h
  user/attilio/vmcontention/sys/sys/buf.h
  user/attilio/vmcontention/sys/sys/mount.h
  user/attilio/vmcontention/sys/sys/mouse.h
  user/attilio/vmcontention/sys/sys/param.h
  user/attilio/vmcontention/sys/sys/signalvar.h
  user/attilio/vmcontention/sys/sys/sleepqueue.h
  user/attilio/vmcontention/sys/sys/systm.h
  user/attilio/vmcontention/sys/ufs/ffs/ffs_alloc.c
  user/attilio/vmcontention/sys/ufs/ffs/ffs_balloc.c
  user/attilio/vmcontention/sys/ufs/ffs/ffs_rawread.c
  user/attilio/vmcontention/sys/ufs/ffs/ffs_vfsops.c
  user/attilio/vmcontention/sys/ufs/ffs/ffs_vnops.c
  user/attilio/vmcontention/sys/ufs/ufs/ufs_extern.h
  user/attilio/vmcontention/sys/vm/swap_pager.c
  user/attilio/vmcontention/sys/vm/swap_pager.h
  user/attilio/vmcontention/sys/vm/vm.h
  user/attilio/vmcontention/sys/vm/vm_init.c
  user/attilio/vmcontention/sys/vm/vm_kern.c
  user/attilio/vmcontention/sys/vm/vnode_pager.c
  user/attilio/vmcontention/usr.sbin/bhyve/acpi.c
  user/attilio/vmcontention/usr.sbin/bhyve/bhyverun.c
  user/attilio/vmcontention/usr.sbin/bhyve/bhyverun.h
  user/attilio/vmcontention/usr.sbin/bhyve/mptbl.c
  user/attilio/vmcontention/usr.sbin/bhyve/pci_emul.c
  user/attilio/vmcontention/usr.sbin/bhyve/pci_virtio_block.c
  user/attilio/vmcontention/usr.sbin/bhyve/pci_virtio_net.c
  user/attilio/vmcontention/usr.sbin/bhyvectl/bhyvectl.c
  user/attilio/vmcontention/usr.sbin/bhyveload/bhyveload.8
  user/attilio/vmcontention/usr.sbin/bhyveload/bhyveload.c
  user/attilio/vmcontention/usr.sbin/moused/moused.c
Directory Properties:
  user/attilio/vmcontention/   (props changed)
  user/attilio/vmcontention/contrib/binutils/   (props changed)
  user/attilio/vmcontention/crypto/openssh/   (props changed)
  user/attilio/vmcontention/lib/libc/   (props changed)
  user/attilio/vmcontention/lib/libvmmapi/   (props changed)
  user/attilio/vmcontention/sbin/   (props changed)
  user/attilio/vmcontention/share/man/man4/   (props changed)
  user/attilio/vmcontention/sys/   (props changed)
  user/attilio/vmcontention/sys/cddl/contrib/opensolaris/   (props changed)
  user/attilio/vmcontention/usr.sbin/bhyve/   (props changed)
  user/attilio/vmcontention/usr.sbin/bhyvectl/   (props changed)
  user/attilio/vmcontention/usr.sbin/bhyveload/   (props changed)

Modified: user/attilio/vmcontention/contrib/binutils/gas/config/tc-arm.c
==============================================================================
--- user/attilio/vmcontention/contrib/binutils/gas/config/tc-arm.c	Tue Mar 19 15:27:29 2013	(r248523)
+++ user/attilio/vmcontention/contrib/binutils/gas/config/tc-arm.c	Tue Mar 19 16:33:43 2013	(r248524)
@@ -7097,7 +7097,7 @@ do_vfp_nsyn_msr (void)
   return SUCCESS;
 }
 
-static int
+static void
 do_vfp_vmrs (void)
 {
   int rt;
@@ -7106,21 +7106,21 @@ do_vfp_vmrs (void)
   if (inst.operands[0].reg > 14)
     {
       inst.error = BAD_PC;
-      return FAIL;
+      return;
     }
 
   /* If the destination is r13 and not in ARM mode then unprefictable */
   if (thumb_mode && inst.operands[0].reg == REG_SP)
     {
       inst.error = BAD_SP;
-      return FAIL;
+      return;
     }
 
   /* If the destination is APSR_nzcv */
   if (inst.operands[0].isvec && inst.operands[1].reg != 1)
     {
       inst.error = BAD_VMRS;
-      return FAIL;
+      return;
     }
 
   if (inst.operands[0].isvec)
@@ -7131,32 +7131,28 @@ do_vfp_vmrs (void)
   /* Or in the registers to use */
   inst.instruction |= rt << 12;
   inst.instruction |= inst.operands[1].reg << 16;
-
-  return SUCCESS;
 }
 
-static int
+static void
 do_vfp_vmsr (void)
 {
   /* The destination register can be r0-r14 or APSR_nzcv */
   if (inst.operands[1].reg > 14)
     {
       inst.error = BAD_PC;
-      return FAIL;
+      return;
     }
 
   /* If the destination is r13 and not in ARM mode then unprefictable */
   if (thumb_mode && inst.operands[0].reg == REG_SP)
     {
       inst.error = BAD_SP;
-      return FAIL;
+      return;
     }
 
   /* Or in the registers to use */
   inst.instruction |= inst.operands[1].reg << 12;
   inst.instruction |= inst.operands[0].reg << 16;
-
-  return SUCCESS;
 }
 
 static void

Modified: user/attilio/vmcontention/crypto/openssh/sshd_config
==============================================================================
--- user/attilio/vmcontention/crypto/openssh/sshd_config	Tue Mar 19 15:27:29 2013	(r248523)
+++ user/attilio/vmcontention/crypto/openssh/sshd_config	Tue Mar 19 16:33:43 2013	(r248524)
@@ -50,8 +50,7 @@
 #PubkeyAuthentication yes
 
 # The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
-# but this is overridden so installations will only check .ssh/authorized_keys
-AuthorizedKeysFile	.ssh/authorized_keys
+#AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2
 
 #AuthorizedPrincipalsFile none
 

Modified: user/attilio/vmcontention/etc/mtree/BSD.usr.dist
==============================================================================
--- user/attilio/vmcontention/etc/mtree/BSD.usr.dist	Tue Mar 19 15:27:29 2013	(r248523)
+++ user/attilio/vmcontention/etc/mtree/BSD.usr.dist	Tue Mar 19 16:33:43 2013	(r248524)
@@ -217,6 +217,8 @@
             ..
             atf
             ..
+            bhyve
+            ..
             bootforth
             ..
             csh

Modified: user/attilio/vmcontention/etc/rc.d/savecore
==============================================================================
--- user/attilio/vmcontention/etc/rc.d/savecore	Tue Mar 19 15:27:29 2013	(r248523)
+++ user/attilio/vmcontention/etc/rc.d/savecore	Tue Mar 19 16:33:43 2013	(r248524)
@@ -23,6 +23,9 @@ savecore_prestart()
 		return 1
 		;;
 	[Aa][Uu][Tt][Oo])
+		if [ ! -L /dev/dumpdev ]; then
+			return 1
+		fi
 		dumpdev=`/bin/realpath /dev/dumpdev`
 		;;
 	esac

Modified: user/attilio/vmcontention/lib/libc/sys/mlock.2
==============================================================================
--- user/attilio/vmcontention/lib/libc/sys/mlock.2	Tue Mar 19 15:27:29 2013	(r248523)
+++ user/attilio/vmcontention/lib/libc/sys/mlock.2	Tue Mar 19 16:33:43 2013	(r248524)
@@ -28,7 +28,7 @@
 .\"	@(#)mlock.2	8.2 (Berkeley) 12/11/93
 .\" $FreeBSD$
 .\"
-.Dd December 25, 2012
+.Dd March 18, 2013
 .Dt MLOCK 2
 .Os
 .Sh NAME
@@ -138,7 +138,12 @@ is set to 0 and the caller is not the su
 .It Bq Er EINVAL
 The address given is not page aligned or the length is negative.
 .It Bq Er ENOMEM
-Some portion of the indicated address range is not allocated.
+Some or all of the address range specified by the addr and len
+arguments does not correspond to valid mapped pages in the address space
+of the process.
+.It Bq Er ENOMEM
+Locking the pages mapped by the specified range would exceed a limit on
+the amount of memory that the process may lock.
 .El
 .Sh "SEE ALSO"
 .Xr fork 2 ,

Modified: user/attilio/vmcontention/lib/libvmmapi/vmmapi.c
==============================================================================
--- user/attilio/vmcontention/lib/libvmmapi/vmmapi.c	Tue Mar 19 15:27:29 2013	(r248523)
+++ user/attilio/vmcontention/lib/libvmmapi/vmmapi.c	Tue Mar 19 16:33:43 2013	(r248524)
@@ -48,8 +48,16 @@ __FBSDID("$FreeBSD$");
 
 #include "vmmapi.h"
 
+#define	GB	(1024 * 1024 * 1024UL)
+
 struct vmctx {
 	int	fd;
+	uint32_t lowmem_limit;
+	enum vm_mmap_style vms;
+	size_t	lowmem;
+	char	*lowmem_addr;
+	size_t	highmem;
+	char	*highmem_addr;
 	char	*name;
 };
 
@@ -90,6 +98,7 @@ vm_open(const char *name)
 	assert(vm != NULL);
 
 	vm->fd = -1;
+	vm->lowmem_limit = 3 * GB;
 	vm->name = (char *)(vm + 1);
 	strcpy(vm->name, name);
 
@@ -151,8 +160,22 @@ vm_get_memory_seg(struct vmctx *ctx, vm_
 	return (error);
 }
 
-int
-vm_setup_memory(struct vmctx *ctx, vm_paddr_t gpa, size_t len, char **mapaddr)
+uint32_t
+vm_get_lowmem_limit(struct vmctx *ctx)
+{
+
+	return (ctx->lowmem_limit);
+}
+
+void
+vm_set_lowmem_limit(struct vmctx *ctx, uint32_t limit)
+{
+
+	ctx->lowmem_limit = limit;
+}
+
+static int
+setup_memory_segment(struct vmctx *ctx, vm_paddr_t gpa, size_t len, char **addr)
 {
 	int error;
 	struct vm_memory_segment seg;
@@ -165,20 +188,69 @@ vm_setup_memory(struct vmctx *ctx, vm_pa
 	seg.gpa = gpa;
 	seg.len = len;
 	error = ioctl(ctx->fd, VM_MAP_MEMORY, &seg);
-	if (error == 0 && mapaddr != NULL) {
-		*mapaddr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED,
+	if (error == 0 && addr != NULL) {
+		*addr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED,
 				ctx->fd, gpa);
 	}
 	return (error);
 }
 
-char *
-vm_map_memory(struct vmctx *ctx, vm_paddr_t gpa, size_t len)
+int
+vm_setup_memory(struct vmctx *ctx, size_t memsize, enum vm_mmap_style vms)
+{
+	char **addr;
+	int error;
+
+	/* XXX VM_MMAP_SPARSE not implemented yet */
+	assert(vms == VM_MMAP_NONE || vms == VM_MMAP_ALL);
+	ctx->vms = vms;
+
+	/*
+	 * If 'memsize' cannot fit entirely in the 'lowmem' segment then
+	 * create another 'highmem' segment above 4GB for the remainder.
+	 */
+	if (memsize > ctx->lowmem_limit) {
+		ctx->lowmem = ctx->lowmem_limit;
+		ctx->highmem = memsize - ctx->lowmem;
+	} else {
+		ctx->lowmem = memsize;
+		ctx->highmem = 0;
+	}
+
+	if (ctx->lowmem > 0) {
+		addr = (vms == VM_MMAP_ALL) ? &ctx->lowmem_addr : NULL;
+		error = setup_memory_segment(ctx, 0, ctx->lowmem, addr);
+		if (error)
+			return (error);
+	}
+
+	if (ctx->highmem > 0) {
+		addr = (vms == VM_MMAP_ALL) ? &ctx->highmem_addr : NULL;
+		error = setup_memory_segment(ctx, 4*GB, ctx->highmem, addr);
+		if (error)
+			return (error);
+	}
+
+	return (0);
+}
+
+void *
+vm_map_gpa(struct vmctx *ctx, vm_paddr_t gaddr, size_t len)
 {
 
-	/* Map 'len' bytes of memory at guest physical address 'gpa' */
-	return ((char *)mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED,
-		     ctx->fd, gpa));
+	/* XXX VM_MMAP_SPARSE not implemented yet */
+	assert(ctx->vms == VM_MMAP_ALL);
+
+	if (gaddr < ctx->lowmem && gaddr + len <= ctx->lowmem)
+		return ((void *)(ctx->lowmem_addr + gaddr));
+
+	if (gaddr >= 4*GB) {
+		gaddr -= 4*GB;
+		if (gaddr < ctx->highmem && gaddr + len <= ctx->highmem)
+			return ((void *)(ctx->highmem_addr + gaddr));
+	}
+
+	return (NULL);
 }
 
 int

Modified: user/attilio/vmcontention/lib/libvmmapi/vmmapi.h
==============================================================================
--- user/attilio/vmcontention/lib/libvmmapi/vmmapi.h	Tue Mar 19 15:27:29 2013	(r248523)
+++ user/attilio/vmcontention/lib/libvmmapi/vmmapi.h	Tue Mar 19 16:33:43 2013	(r248524)
@@ -32,24 +32,26 @@
 struct vmctx;
 enum x2apic_state;
 
+/*
+ * Different styles of mapping the memory assigned to a VM into the address
+ * space of the controlling process.
+ */
+enum vm_mmap_style {
+	VM_MMAP_NONE,		/* no mapping */
+	VM_MMAP_ALL,		/* fully and statically mapped */
+	VM_MMAP_SPARSE,		/* mappings created on-demand */
+};
+
 int	vm_create(const char *name);
 struct vmctx *vm_open(const char *name);
 void	vm_destroy(struct vmctx *ctx);
 size_t	vmm_get_mem_total(void);
 size_t	vmm_get_mem_free(void);
 int	vm_get_memory_seg(struct vmctx *ctx, vm_paddr_t gpa, size_t *ret_len);
-/*
- * Create a memory segment of 'len' bytes in the guest physical address space
- * at offset 'gpa'.
- *
- * If 'mapaddr' is not NULL then this region is mmap'ed into the address
- * space of the calling process. If there is an mmap error then *mapaddr
- * will be set to MAP_FAILED.
- */
-
-int	vm_setup_memory(struct vmctx *ctx, vm_paddr_t gpa, size_t len,
-		      char **mapaddr);
-char *  vm_map_memory(struct vmctx *ctx, vm_paddr_t gpa, size_t len);
+int	vm_setup_memory(struct vmctx *ctx, size_t len, enum vm_mmap_style s);
+void	*vm_map_gpa(struct vmctx *ctx, vm_paddr_t gaddr, size_t len);
+uint32_t vm_get_lowmem_limit(struct vmctx *ctx);
+void	vm_set_lowmem_limit(struct vmctx *ctx, uint32_t limit);
 int	vm_set_desc(struct vmctx *ctx, int vcpu, int reg,
 		    uint64_t base, uint32_t limit, uint32_t access);
 int	vm_get_desc(struct vmctx *ctx, int vcpu, int reg,

Modified: user/attilio/vmcontention/sbin/geom/class/eli/geom_eli.c
==============================================================================
--- user/attilio/vmcontention/sbin/geom/class/eli/geom_eli.c	Tue Mar 19 15:27:29 2013	(r248523)
+++ user/attilio/vmcontention/sbin/geom/class/eli/geom_eli.c	Tue Mar 19 16:33:43 2013	(r248524)
@@ -259,6 +259,8 @@ struct g_command class_commands[] = {
 
 static int verbose = 0;
 
+#define	BUFSIZE	1024
+
 static int
 eli_protect(struct gctl_req *req)
 {
@@ -344,7 +346,7 @@ static int
 eli_genkey_files(struct gctl_req *req, bool new, const char *type,
     struct hmac_ctx *ctxp, char *passbuf, size_t passbufsize)
 {
-	char *p, buf[MAXPHYS], argname[16];
+	char *p, buf[BUFSIZE], argname[16];
 	const char *file;
 	int error, fd, i;
 	ssize_t done;
@@ -431,7 +433,7 @@ eli_genkey_passphrase_prompt(struct gctl
 		}
 
 		if (new) {
-			char tmpbuf[BUFSIZ];
+			char tmpbuf[BUFSIZE];
 
 			p = readpassphrase("Reenter new passphrase: ",
 			    tmpbuf, sizeof(tmpbuf),
@@ -460,7 +462,7 @@ static int
 eli_genkey_passphrase(struct gctl_req *req, struct g_eli_metadata *md, bool new,
     struct hmac_ctx *ctxp)
 {
-	char passbuf[MAXPHYS];
+	char passbuf[BUFSIZE];
 	bool nopassphrase;
 	int nfiles;
 

Modified: user/attilio/vmcontention/sbin/ldconfig/ldconfig.8
==============================================================================
--- user/attilio/vmcontention/sbin/ldconfig/ldconfig.8	Tue Mar 19 15:27:29 2013	(r248523)
+++ user/attilio/vmcontention/sbin/ldconfig/ldconfig.8	Tue Mar 19 16:33:43 2013	(r248524)
@@ -29,7 +29,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd November 11, 2005
+.Dd March 19, 2013
 .Dt LDCONFIG 8
 .Os
 .Sh NAME
@@ -162,21 +162,6 @@ In
 addition to building a set of hints for quick lookup, it also serves to
 specify the trusted collection of directories from which shared objects can
 be safely loaded.
-.Sh ENVIRONMENT
-.Bl -tag -width OBJFORMATxxx -compact
-.It Ev OBJFORMAT
-Overrides
-.Pa /etc/objformat
-(see below) to determine whether
-.Fl aout
-or
-.Fl elf
-is the default.
-If set, its value should be either
-.Ql aout
-or
-.Ql elf .
-.El
 .Sh FILES
 .Bl -tag -width /var/run/ld-elf.so.hintsxxx -compact
 .It Pa /var/run/ld.so.hints
@@ -196,17 +181,6 @@ invocations with
 Conventional configuration files containing directory names for
 invocations with
 .Fl 32 .
-.It Pa /etc/objformat
-Determines whether
-.Fl aout
-or
-.Fl elf
-is the default.
-If present, it must consist of a single line
-containing either
-.Ql OBJFORMAT=aout
-or
-.Ql OBJFORMAT=elf .
 .El
 .Sh SEE ALSO
 .Xr ld 1 ,

Modified: user/attilio/vmcontention/share/examples/Makefile
==============================================================================
--- user/attilio/vmcontention/share/examples/Makefile	Tue Mar 19 15:27:29 2013	(r248523)
+++ user/attilio/vmcontention/share/examples/Makefile	Tue Mar 19 16:33:43 2013	(r248524)
@@ -7,6 +7,7 @@
 LDIRS=	BSD_daemon \
 	FreeBSD_version \
 	IPv6 \
+	bhyve \
 	bootforth \
 	csh \
 	cvsup \
@@ -42,6 +43,7 @@ XFILES=	BSD_daemon/FreeBSD.pfa \
 	FreeBSD_version/Makefile \
 	FreeBSD_version/README \
 	IPv6/USAGE \
+	bhyve/vmrun.sh \
 	bootforth/README \
 	bootforth/boot.4th \
 	bootforth/frames.4th \

Modified: user/attilio/vmcontention/share/man/man4/iwn.4
==============================================================================
--- user/attilio/vmcontention/share/man/man4/iwn.4	Tue Mar 19 15:27:29 2013	(r248523)
+++ user/attilio/vmcontention/share/man/man4/iwn.4	Tue Mar 19 16:33:43 2013	(r248524)
@@ -25,7 +25,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd March 27, 2012
+.Dd March 19, 2013
 .Dt IWN 4
 .Os
 .Sh NAME
@@ -100,8 +100,7 @@ driver provides support for:
 .Pp
 .Nm
 supports
-.Cm station ,
-.Cm adhoc ,
+.Cm station
 and
 .Cm monitor
 mode operation.

Modified: user/attilio/vmcontention/share/man/man4/psm.4
==============================================================================
--- user/attilio/vmcontention/share/man/man4/psm.4	Tue Mar 19 15:27:29 2013	(r248523)
+++ user/attilio/vmcontention/share/man/man4/psm.4	Tue Mar 19 16:33:43 2013	(r248524)
@@ -26,7 +26,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd March 27, 2012
+.Dd March 18, 2013
 .Dt PSM 4
 .Os
 .Sh NAME
@@ -339,6 +339,12 @@ at boot-time.
 This will enable
 .Nm
 to handle packets from guest devices (sticks) and extra buttons.
+Similarly, extended support for IBM/Lenovo TrackPoint can be enabled
+by setting
+.Va hw.psm.trackpoint_support
+to
+.Em 1
+at boot-time.
 .Pp
 Tap and drag gestures can be disabled by setting
 .Va hw.psm.tap_enabled
@@ -832,8 +838,8 @@ In contrast, some pad products, e.g.\& s
 and Interlink VersaPad, treat the tapping action
 as fourth button events.
 .Pp
-It is reported that ALPS GlidePoint, Synaptics Touchpad, and
-Interlink VersaPad require
+It is reported that ALPS GlidePoint, Synaptics Touchpad, IBM/Lenovo
+TrackPoint, and Interlink VersaPad require
 .Em INITAFTERSUSPEND
 flag in order to recover from suspended state.
 This flag is automatically set when one of these devices is detected by the

Modified: user/attilio/vmcontention/sys/amd64/amd64/pmap.c
==============================================================================
--- user/attilio/vmcontention/sys/amd64/amd64/pmap.c	Tue Mar 19 15:27:29 2013	(r248523)
+++ user/attilio/vmcontention/sys/amd64/amd64/pmap.c	Tue Mar 19 16:33:43 2013	(r248524)
@@ -4235,6 +4235,8 @@ pmap_copy_page(vm_page_t msrc, vm_page_t
 	pagecopy((void *)src, (void *)dst);
 }
 
+int unmapped_buf_allowed = 1;
+
 void
 pmap_copy_pages(vm_page_t ma[], vm_offset_t a_offset, vm_page_t mb[],
     vm_offset_t b_offset, int xfersize)

Modified: user/attilio/vmcontention/sys/arm/arm/pmap-v6.c
==============================================================================
--- user/attilio/vmcontention/sys/arm/arm/pmap-v6.c	Tue Mar 19 15:27:29 2013	(r248523)
+++ user/attilio/vmcontention/sys/arm/arm/pmap-v6.c	Tue Mar 19 16:33:43 2013	(r248524)
@@ -3312,6 +3312,8 @@ pmap_copy_page_generic(vm_paddr_t src, v
 	mtx_unlock(&cmtx);
 }
 
+int unmapped_buf_allowed = 1;
+
 void
 pmap_copy_pages(vm_page_t ma[], vm_offset_t a_offset, vm_page_t mb[],
     vm_offset_t b_offset, int xfersize)

Modified: user/attilio/vmcontention/sys/arm/arm/pmap.c
==============================================================================
--- user/attilio/vmcontention/sys/arm/arm/pmap.c	Tue Mar 19 15:27:29 2013	(r248523)
+++ user/attilio/vmcontention/sys/arm/arm/pmap.c	Tue Mar 19 16:33:43 2013	(r248524)
@@ -4428,6 +4428,8 @@ pmap_copy_page(vm_page_t src, vm_page_t 
 #endif
 }
 
+int unmapped_buf_allowed = 1;
+
 void
 pmap_copy_pages(vm_page_t ma[], vm_offset_t a_offset, vm_page_t mb[],
     vm_offset_t b_offset, int xfersize)

Modified: user/attilio/vmcontention/sys/arm/include/bus.h
==============================================================================
--- user/attilio/vmcontention/sys/arm/include/bus.h	Tue Mar 19 15:27:29 2013	(r248523)
+++ user/attilio/vmcontention/sys/arm/include/bus.h	Tue Mar 19 16:33:43 2013	(r248524)
@@ -731,6 +731,6 @@ bs_c_8_proto(f);
  * designed.  It also serves to mark the locations needing that fix.
  */
 #define BUS_SPACE_PHYSADDR(res, offs) \
-	(vtophys(rman_get_start(res)+(offs)))
+	((u_int)(rman_get_start(res)+(offs)))
 
 #endif /* _MACHINE_BUS_H_ */

Modified: user/attilio/vmcontention/sys/cam/ata/ata_da.c
==============================================================================
--- user/attilio/vmcontention/sys/cam/ata/ata_da.c	Tue Mar 19 15:27:29 2013	(r248523)
+++ user/attilio/vmcontention/sys/cam/ata/ata_da.c	Tue Mar 19 16:33:43 2013	(r248524)
@@ -1167,6 +1167,8 @@ adaregister(struct cam_periph *periph, v
 	    ((softc->flags & ADA_FLAG_CAN_CFA) &&
 	    !(softc->flags & ADA_FLAG_CAN_48BIT)))
 		softc->disk->d_flags |= DISKFLAG_CANDELETE;
+	if ((cpi.hba_misc & PIM_UNMAPPED) != 0)
+		softc->disk->d_flags |= DISKFLAG_UNMAPPED_BIO;
 	strlcpy(softc->disk->d_descr, cgd->ident_data.model,
 	    MIN(sizeof(softc->disk->d_descr), sizeof(cgd->ident_data.model)));
 	strlcpy(softc->disk->d_ident, cgd->ident_data.serial,
@@ -1431,13 +1433,19 @@ adastart(struct cam_periph *periph, unio
 				return;
 			}
 #endif
+			KASSERT((bp->bio_flags & BIO_UNMAPPED) == 0 ||
+			    round_page(bp->bio_bcount + bp->bio_ma_offset) /
+			    PAGE_SIZE == bp->bio_ma_n,
+			    ("Short bio %p", bp));
 			cam_fill_ataio(ataio,
 			    ada_retry_count,
 			    adadone,
-			    bp->bio_cmd == BIO_READ ?
-			        CAM_DIR_IN : CAM_DIR_OUT,
+			    (bp->bio_cmd == BIO_READ ? CAM_DIR_IN :
+				CAM_DIR_OUT) | ((bp->bio_flags & BIO_UNMAPPED)
+				!= 0 ? CAM_DATA_BIO : 0),
 			    tag_code,
-			    bp->bio_data,
+			    ((bp->bio_flags & BIO_UNMAPPED) != 0) ? (void *)bp :
+				bp->bio_data,
 			    bp->bio_bcount,
 			    ada_default_timeout*1000);
 

Modified: user/attilio/vmcontention/sys/cam/cam_ccb.h
==============================================================================
--- user/attilio/vmcontention/sys/cam/cam_ccb.h	Tue Mar 19 15:27:29 2013	(r248523)
+++ user/attilio/vmcontention/sys/cam/cam_ccb.h	Tue Mar 19 16:33:43 2013	(r248524)
@@ -42,7 +42,6 @@
 #include <cam/scsi/scsi_all.h>
 #include <cam/ata/ata_all.h>
 
-
 /* General allocation length definitions for CCB structures */
 #define	IOCDBLEN	CAM_MAX_CDBLEN	/* Space for CDB bytes/pointer */
 #define	VUHBALEN	14		/* Vendor Unique HBA length */
@@ -100,7 +99,7 @@ typedef enum {
 	CAM_MSGB_VALID		= 0x10000000,/* Message buffer valid	      */
 	CAM_STATUS_VALID	= 0x20000000,/* Status buffer valid	      */
 	CAM_DATAB_VALID		= 0x40000000,/* Data buffer valid	      */
-	
+
 /* Host target Mode flags */
 	CAM_SEND_SENSE		= 0x08000000,/* Send sense data with status   */
 	CAM_TERM_IO		= 0x10000000,/* Terminate I/O Message sup.    */
@@ -572,7 +571,8 @@ typedef enum {
 	PIM_NOINITIATOR	= 0x20,	/* Initiator role not supported. */
 	PIM_NOBUSRESET	= 0x10,	/* User has disabled initial BUS RESET */
 	PIM_NO_6_BYTE	= 0x08,	/* Do not send 6-byte commands */
-	PIM_SEQSCAN	= 0x04	/* Do bus scans sequentially, not in parallel */
+	PIM_SEQSCAN	= 0x04,	/* Do bus scans sequentially, not in parallel */
+	PIM_UNMAPPED	= 0x02,
 } pi_miscflag;
 
 /* Path Inquiry CCB */

Modified: user/attilio/vmcontention/sys/cam/cam_periph.c
==============================================================================
--- user/attilio/vmcontention/sys/cam/cam_periph.c	Tue Mar 19 15:27:29 2013	(r248523)
+++ user/attilio/vmcontention/sys/cam/cam_periph.c	Tue Mar 19 16:33:43 2013	(r248524)
@@ -734,6 +734,8 @@ cam_periph_mapmem(union ccb *ccb, struct
 	case XPT_CONT_TARGET_IO:
 		if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_NONE)
 			return(0);
+		KASSERT((ccb->ccb_h.flags & CAM_DATA_MASK) == CAM_DATA_VADDR,
+		    ("not VADDR for SCSI_IO %p %x\n", ccb, ccb->ccb_h.flags));
 
 		data_ptrs[0] = &ccb->csio.data_ptr;
 		lengths[0] = ccb->csio.dxfer_len;
@@ -743,6 +745,8 @@ cam_periph_mapmem(union ccb *ccb, struct
 	case XPT_ATA_IO:
 		if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_NONE)
 			return(0);
+		KASSERT((ccb->ccb_h.flags & CAM_DATA_MASK) == CAM_DATA_VADDR,
+		    ("not VADDR for ATA_IO %p %x\n", ccb, ccb->ccb_h.flags));
 
 		data_ptrs[0] = &ccb->ataio.data_ptr;
 		lengths[0] = ccb->ataio.dxfer_len;
@@ -846,7 +850,7 @@ cam_periph_mapmem(union ccb *ccb, struct
 		 * into a larger area of VM, or if userland races against
 		 * vmapbuf() after the useracc() check.
 		 */
-		if (vmapbuf(mapinfo->bp[i]) < 0) {
+		if (vmapbuf(mapinfo->bp[i], 1) < 0) {
 			for (j = 0; j < i; ++j) {
 				*data_ptrs[j] = mapinfo->bp[j]->b_saveaddr;
 				vunmapbuf(mapinfo->bp[j]);

Modified: user/attilio/vmcontention/sys/cam/scsi/scsi_all.c
==============================================================================
--- user/attilio/vmcontention/sys/cam/scsi/scsi_all.c	Tue Mar 19 15:27:29 2013	(r248523)
+++ user/attilio/vmcontention/sys/cam/scsi/scsi_all.c	Tue Mar 19 16:33:43 2013	(r248524)
@@ -5679,7 +5679,11 @@ scsi_read_write(struct ccb_scsiio *csio,
 		u_int8_t *data_ptr, u_int32_t dxfer_len, u_int8_t sense_len,
 		u_int32_t timeout)
 {
+	int read;
 	u_int8_t cdb_len;
+
+	read = (readop & SCSI_RW_DIRMASK) == SCSI_RW_READ;
+
 	/*
 	 * Use the smallest possible command to perform the operation
 	 * as some legacy hardware does not support the 10 byte commands.
@@ -5696,7 +5700,7 @@ scsi_read_write(struct ccb_scsiio *csio,
 		struct scsi_rw_6 *scsi_cmd;
 
 		scsi_cmd = (struct scsi_rw_6 *)&csio->cdb_io.cdb_bytes;
-		scsi_cmd->opcode = readop ? READ_6 : WRITE_6;
+		scsi_cmd->opcode = read ? READ_6 : WRITE_6;
 		scsi_ulto3b(lba, scsi_cmd->addr);
 		scsi_cmd->length = block_count & 0xff;
 		scsi_cmd->control = 0;
@@ -5715,7 +5719,7 @@ scsi_read_write(struct ccb_scsiio *csio,
 		struct scsi_rw_10 *scsi_cmd;
 
 		scsi_cmd = (struct scsi_rw_10 *)&csio->cdb_io.cdb_bytes;
-		scsi_cmd->opcode = readop ? READ_10 : WRITE_10;
+		scsi_cmd->opcode = read ? READ_10 : WRITE_10;
 		scsi_cmd->byte2 = byte2;
 		scsi_ulto4b(lba, scsi_cmd->addr);
 		scsi_cmd->reserved = 0;
@@ -5738,7 +5742,7 @@ scsi_read_write(struct ccb_scsiio *csio,
 		struct scsi_rw_12 *scsi_cmd;
 
 		scsi_cmd = (struct scsi_rw_12 *)&csio->cdb_io.cdb_bytes;
-		scsi_cmd->opcode = readop ? READ_12 : WRITE_12;
+		scsi_cmd->opcode = read ? READ_12 : WRITE_12;
 		scsi_cmd->byte2 = byte2;
 		scsi_ulto4b(lba, scsi_cmd->addr);
 		scsi_cmd->reserved = 0;
@@ -5760,7 +5764,7 @@ scsi_read_write(struct ccb_scsiio *csio,
 		struct scsi_rw_16 *scsi_cmd;
 
 		scsi_cmd = (struct scsi_rw_16 *)&csio->cdb_io.cdb_bytes;
-		scsi_cmd->opcode = readop ? READ_16 : WRITE_16;
+		scsi_cmd->opcode = read ? READ_16 : WRITE_16;
 		scsi_cmd->byte2 = byte2;
 		scsi_u64to8b(lba, scsi_cmd->addr);
 		scsi_cmd->reserved = 0;
@@ -5771,7 +5775,8 @@ scsi_read_write(struct ccb_scsiio *csio,
 	cam_fill_csio(csio,
 		      retries,
 		      cbfcnp,
-		      /*flags*/readop ? CAM_DIR_IN : CAM_DIR_OUT,
+		      (read ? CAM_DIR_IN : CAM_DIR_OUT) |
+		      ((readop & SCSI_RW_BIO) != 0 ? CAM_DATA_BIO : 0),
 		      tag_action,
 		      data_ptr,
 		      dxfer_len,

Modified: user/attilio/vmcontention/sys/cam/scsi/scsi_all.h
==============================================================================
--- user/attilio/vmcontention/sys/cam/scsi/scsi_all.h	Tue Mar 19 15:27:29 2013	(r248523)
+++ user/attilio/vmcontention/sys/cam/scsi/scsi_all.h	Tue Mar 19 16:33:43 2013	(r248524)
@@ -2354,6 +2354,10 @@ void scsi_write_buffer(struct ccb_scsiio
 			uint8_t *data_ptr, uint32_t param_list_length,
 			uint8_t sense_len, uint32_t timeout);
 
+#define	SCSI_RW_READ	0x0001
+#define	SCSI_RW_WRITE	0x0002
+#define	SCSI_RW_DIRMASK	0x0003
+#define	SCSI_RW_BIO	0x1000
 void scsi_read_write(struct ccb_scsiio *csio, u_int32_t retries,
 		     void (*cbfcnp)(struct cam_periph *, union ccb *),
 		     u_int8_t tag_action, int readop, u_int8_t byte2, 

Modified: user/attilio/vmcontention/sys/cam/scsi/scsi_cd.c
==============================================================================
--- user/attilio/vmcontention/sys/cam/scsi/scsi_cd.c	Tue Mar 19 15:27:29 2013	(r248523)
+++ user/attilio/vmcontention/sys/cam/scsi/scsi_cd.c	Tue Mar 19 16:33:43 2013	(r248524)
@@ -1575,7 +1575,8 @@ cdstart(struct cam_periph *periph, union
 					/*retries*/ cd_retry_count,
 					/* cbfcnp */ cddone,
 					MSG_SIMPLE_Q_TAG,
-					/* read */bp->bio_cmd == BIO_READ,
+					/* read */bp->bio_cmd == BIO_READ ?
+					SCSI_RW_READ : SCSI_RW_WRITE,
 					/* byte2 */ 0,
 					/* minimum_cmd_size */ 10,
 					/* lba */ bp->bio_offset /

Modified: user/attilio/vmcontention/sys/cam/scsi/scsi_da.c
==============================================================================
--- user/attilio/vmcontention/sys/cam/scsi/scsi_da.c	Tue Mar 19 15:27:29 2013	(r248523)
+++ user/attilio/vmcontention/sys/cam/scsi/scsi_da.c	Tue Mar 19 16:33:43 2013	(r248524)
@@ -1184,7 +1184,7 @@ dadump(void *arg, void *virtual, vm_offs
 				/*retries*/0,
 				dadone,
 				MSG_ORDERED_Q_TAG,
-				/*read*/FALSE,
+				/*read*/SCSI_RW_WRITE,
 				/*byte2*/0,
 				/*minimum_cmd_size*/ softc->minimum_cmd_size,
 				offset / secsize,
@@ -1757,6 +1757,8 @@ daregister(struct cam_periph *periph, vo
 	softc->disk->d_flags = 0;
 	if ((softc->quirks & DA_Q_NO_SYNC_CACHE) == 0)
 		softc->disk->d_flags |= DISKFLAG_CANFLUSHCACHE;
+	if ((cpi.hba_misc & PIM_UNMAPPED) != 0)
+		softc->disk->d_flags |= DISKFLAG_UNMAPPED_BIO;
 	cam_strvis(softc->disk->d_descr, cgd->inq_data.vendor,
 	    sizeof(cgd->inq_data.vendor), sizeof(softc->disk->d_descr));
 	strlcat(softc->disk->d_descr, " ", sizeof(softc->disk->d_descr));
@@ -1985,14 +1987,18 @@ dastart(struct cam_periph *periph, union
 					/*retries*/da_retry_count,
 					/*cbfcnp*/dadone,
 					/*tag_action*/tag_code,
-					/*read_op*/bp->bio_cmd
-						== BIO_READ,
+					/*read_op*/(bp->bio_cmd == BIO_READ ?
+					SCSI_RW_READ : SCSI_RW_WRITE) |
+					((bp->bio_flags & BIO_UNMAPPED) != 0 ?
+					SCSI_RW_BIO : 0),
 					/*byte2*/0,
 					softc->minimum_cmd_size,
 					/*lba*/bp->bio_pblkno,
 					/*block_count*/bp->bio_bcount /
 					softc->params.secsize,
-					/*data_ptr*/ bp->bio_data,
+					/*data_ptr*/ (bp->bio_flags &
+					BIO_UNMAPPED) != 0 ? (void *)bp :
+					bp->bio_data,
 					/*dxfer_len*/ bp->bio_bcount,
 					/*sense_len*/SSD_FULL_SIZE,
 					da_default_timeout * 1000);

Modified: user/attilio/vmcontention/sys/cddl/compat/opensolaris/sys/sig.h
==============================================================================
--- user/attilio/vmcontention/sys/cddl/compat/opensolaris/sys/sig.h	Tue Mar 19 15:27:29 2013	(r248523)
+++ user/attilio/vmcontention/sys/cddl/compat/opensolaris/sys/sig.h	Tue Mar 19 16:33:43 2013	(r248524)
@@ -55,7 +55,7 @@ issig(int why)
 		p = td->td_proc;
 		PROC_LOCK(p);
 		mtx_lock(&p->p_sigacts->ps_mtx);
-		sig = cursig(td, SIG_STOP_ALLOWED);
+		sig = cursig(td);
 		mtx_unlock(&p->p_sigacts->ps_mtx);
 		PROC_UNLOCK(p);
 		if (sig != 0)

Modified: user/attilio/vmcontention/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
==============================================================================
--- user/attilio/vmcontention/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c	Tue Mar 19 15:27:29 2013	(r248523)
+++ user/attilio/vmcontention/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c	Tue Mar 19 16:33:43 2013	(r248524)
@@ -919,7 +919,8 @@ dsl_check_snap_cb(const char *name, void
 	char *dsname;
 
 	dsname = kmem_asprintf("%s@%s", name, da->snapname);
-	VERIFY(nvlist_add_boolean(da->nvl, dsname) == 0);
+	fnvlist_add_boolean(da->nvl, dsname);
+	kmem_free(dsname, strlen(dsname) + 1);
 
 	return (0);
 }

Modified: user/attilio/vmcontention/sys/dev/ahci/ahci.c
==============================================================================
--- user/attilio/vmcontention/sys/dev/ahci/ahci.c	Tue Mar 19 15:27:29 2013	(r248523)
+++ user/attilio/vmcontention/sys/dev/ahci/ahci.c	Tue Mar 19 16:33:43 2013	(r248524)
@@ -2903,7 +2903,7 @@ ahciaction(struct cam_sim *sim, union cc
 		if (ch->caps & AHCI_CAP_SPM)
 			cpi->hba_inquiry |= PI_SATAPM;
 		cpi->target_sprt = 0;
-		cpi->hba_misc = PIM_SEQSCAN;
+		cpi->hba_misc = PIM_SEQSCAN | PIM_UNMAPPED;
 		cpi->hba_eng_cnt = 0;
 		if (ch->caps & AHCI_CAP_SPM)
 			cpi->max_target = 15;

Modified: user/attilio/vmcontention/sys/dev/atkbdc/psm.c
==============================================================================
--- user/attilio/vmcontention/sys/dev/atkbdc/psm.c	Tue Mar 19 15:27:29 2013	(r248523)
+++ user/attilio/vmcontention/sys/dev/atkbdc/psm.c	Tue Mar 19 16:33:43 2013	(r248524)
@@ -260,6 +260,38 @@ typedef struct synapticsaction {
 	int			in_vscroll;
 } synapticsaction_t;
 
+enum {
+	TRACKPOINT_SYSCTL_SENSITIVITY,
+	TRACKPOINT_SYSCTL_NEGATIVE_INERTIA,
+	TRACKPOINT_SYSCTL_UPPER_PLATEAU,
+	TRACKPOINT_SYSCTL_BACKUP_RANGE,
+	TRACKPOINT_SYSCTL_DRAG_HYSTERESIS,
+	TRACKPOINT_SYSCTL_MINIMUM_DRAG,
+	TRACKPOINT_SYSCTL_UP_THRESHOLD,
+	TRACKPOINT_SYSCTL_THRESHOLD,
+	TRACKPOINT_SYSCTL_JENKS_CURVATURE,
+	TRACKPOINT_SYSCTL_Z_TIME,
+	TRACKPOINT_SYSCTL_PRESS_TO_SELECT,
+	TRACKPOINT_SYSCTL_SKIP_BACKUPS
+};
+
+typedef struct trackpointinfo {
+	struct sysctl_ctx_list sysctl_ctx;
+	struct sysctl_oid *sysctl_tree;
+	int	sensitivity;
+	int	inertia;
+	int	uplateau;
+	int	reach;
+	int	draghys;
+	int	mindrag;
+	int	upthresh;
+	int	threshold;
+	int	jenks;
+	int	ztime;
+	int	pts;
+	int	skipback;
+} trackpointinfo_t;
+
 /* driver control block */
 struct psm_softc {		/* Driver status information */
 	int		unit;
@@ -274,6 +306,8 @@ struct psm_softc {		/* Driver status inf
 	synapticshw_t	synhw;		/* Synaptics hardware information */
 	synapticsinfo_t	syninfo;	/* Synaptics configuration */
 	synapticsaction_t synaction;	/* Synaptics action context */
+	int		tphw;		/* TrackPoint hardware information */
+	trackpointinfo_t tpinfo;	/* TrackPoint configuration */
 	mousemode_t	mode;		/* operation mode */
 	mousemode_t	dflt_mode;	/* default operation mode */
 	mousestatus_t	status;		/* accumulated mouse movement */
@@ -344,6 +378,9 @@ TUNABLE_INT("hw.psm.tap_enabled", &tap_e
 static int synaptics_support = 0;
 TUNABLE_INT("hw.psm.synaptics_support", &synaptics_support);
 
+static int trackpoint_support = 0;
+TUNABLE_INT("hw.psm.trackpoint_support", &trackpoint_support);
+
 static int verbose = PSM_DEBUG;
 TUNABLE_INT("debug.psm.loglevel", &verbose);
 
@@ -432,6 +469,7 @@ static probefunc_t	enable_4dmouse;
 static probefunc_t	enable_4dplus;
 static probefunc_t	enable_mmanplus;
 static probefunc_t	enable_synaptics;
+static probefunc_t	enable_trackpoint;
 static probefunc_t	enable_versapad;
 
 static struct {
@@ -466,6 +504,8 @@ static struct {
 	  0x80, MOUSE_PS2_PACKETSIZE, enable_kmouse },
 	{ MOUSE_MODEL_VERSAPAD,		/* Interlink electronics VersaPad */
 	  0xe8, MOUSE_PS2VERSA_PACKETSIZE, enable_versapad },
+	{ MOUSE_MODEL_TRACKPOINT,	/* IBM/Lenovo TrackPoint */
+	  0xc0, MOUSE_PS2_PACKETSIZE, enable_trackpoint },
 	{ MOUSE_MODEL_GENERIC,
 	  0xc0, MOUSE_PS2_PACKETSIZE, NULL },
 };
@@ -707,6 +747,7 @@ model_name(int model)
 		{ MOUSE_MODEL_4D,		"4D Mouse" },
 		{ MOUSE_MODEL_4DPLUS,		"4D+ Mouse" },
 		{ MOUSE_MODEL_SYNAPTICS,	"Synaptics Touchpad" },
+		{ MOUSE_MODEL_TRACKPOINT,	"IBM/Lenovo TrackPoint" },
 		{ MOUSE_MODEL_GENERIC,		"Generic PS/2 mouse" },
 		{ MOUSE_MODEL_UNKNOWN,		"Unknown" },
 	};
@@ -1452,7 +1493,7 @@ psmattach(device_t dev)
 		sc->config |= PSM_CONFIG_INITAFTERSUSPEND;
 		break;
 	default:
-		if (sc->synhw.infoMajor >= 4)
+		if (sc->synhw.infoMajor >= 4 || sc->tphw > 0)
 			sc->config |= PSM_CONFIG_INITAFTERSUSPEND;
 		break;
 	}
@@ -3442,6 +3483,7 @@ psmsoftintr(void *arg)
 				goto next;
 			break;
 
+		case MOUSE_MODEL_TRACKPOINT:
 		case MOUSE_MODEL_GENERIC:
 		default:
 			break;
@@ -4474,6 +4516,233 @@ enable_synaptics(KBDC kbdc, struct psm_s
 	return (TRUE);
 }
 
+/* IBM/Lenovo TrackPoint */
+static int
+trackpoint_command(KBDC kbdc, int cmd, int loc, int val)
+{
+	const int seq[] = { 0xe2, cmd, loc, val };
+	int i;
+
+	for (i = 0; i < nitems(seq); i++)
+		if (send_aux_command(kbdc, seq[i]) != PSM_ACK)
+			return (EIO);
+	return (0);
+}
+
+#define	PSM_TPINFO(x)	offsetof(struct psm_softc, tpinfo.x)
+#define	TPMASK		0
+#define	TPLOC		1
+#define	TPINFO		2
+
+static int
+trackpoint_sysctl(SYSCTL_HANDLER_ARGS)
+{
+	static const int data[][3] = {
+		{ 0x00, 0x4a, PSM_TPINFO(sensitivity) },
+		{ 0x00, 0x4d, PSM_TPINFO(inertia) },
+		{ 0x00, 0x60, PSM_TPINFO(uplateau) },
+		{ 0x00, 0x57, PSM_TPINFO(reach) },
+		{ 0x00, 0x58, PSM_TPINFO(draghys) },
+		{ 0x00, 0x59, PSM_TPINFO(mindrag) },
+		{ 0x00, 0x5a, PSM_TPINFO(upthresh) },
+		{ 0x00, 0x5c, PSM_TPINFO(threshold) },
+		{ 0x00, 0x5d, PSM_TPINFO(jenks) },
+		{ 0x00, 0x5e, PSM_TPINFO(ztime) },
+		{ 0x01, 0x2c, PSM_TPINFO(pts) },
+		{ 0x08, 0x2d, PSM_TPINFO(skipback) }
+	};
+	struct psm_softc *sc;
+	int error, newval, *oldvalp;
+	const int *tp;
+
+	if (arg1 == NULL || arg2 < 0 || arg2 >= nitems(data))
+		return (EINVAL);
+	sc = arg1;
+	tp = data[arg2];
+	oldvalp = (int *)((intptr_t)sc + tp[TPINFO]);
+	newval = *oldvalp;
+	error = sysctl_handle_int(oidp, &newval, 0, req);
+	if (error != 0)
+		return (error);
+	if (newval == *oldvalp)
+		return (0);
+	if (newval < 0 || newval > (tp[TPMASK] == 0 ? 255 : 1))
+		return (EINVAL);
+	error = trackpoint_command(sc->kbdc, tp[TPMASK] == 0 ? 0x81 : 0x47,
+	    tp[TPLOC], tp[TPMASK] == 0 ? newval : tp[TPMASK]);
+	if (error != 0)
+		return (error);
+	*oldvalp = newval;
+
+	return (0);
+}
+
+static void
+trackpoint_sysctl_create_tree(struct psm_softc *sc)
+{
+
+	if (sc->tpinfo.sysctl_tree != NULL)
+		return;
+
+	/* Attach extra trackpoint sysctl nodes under hw.psm.trackpoint */
+	sysctl_ctx_init(&sc->tpinfo.sysctl_ctx);
+	sc->tpinfo.sysctl_tree = SYSCTL_ADD_NODE(&sc->tpinfo.sysctl_ctx,
+	    SYSCTL_STATIC_CHILDREN(_hw_psm), OID_AUTO, "trackpoint", CTLFLAG_RD,
+	    0, "IBM/Lenovo TrackPoint");
+
+	/* hw.psm.trackpoint.sensitivity */
+	sc->tpinfo.sensitivity = 0x64;
+	SYSCTL_ADD_PROC(&sc->tpinfo.sysctl_ctx,
+	    SYSCTL_CHILDREN(sc->tpinfo.sysctl_tree), OID_AUTO,
+	    "sensitivity", CTLTYPE_INT|CTLFLAG_RW|CTLFLAG_ANYBODY,
+	    sc, TRACKPOINT_SYSCTL_SENSITIVITY,
+	    trackpoint_sysctl, "I",
+	    "Sensitivity");
+
+	/* hw.psm.trackpoint.negative_inertia */
+	sc->tpinfo.inertia = 0x06;
+	SYSCTL_ADD_PROC(&sc->tpinfo.sysctl_ctx,
+	    SYSCTL_CHILDREN(sc->tpinfo.sysctl_tree), OID_AUTO,
+	    "negative_inertia", CTLTYPE_INT|CTLFLAG_RW|CTLFLAG_ANYBODY,
+	    sc, TRACKPOINT_SYSCTL_NEGATIVE_INERTIA,
+	    trackpoint_sysctl, "I",
+	    "Negative inertia factor");
+
+	/* hw.psm.trackpoint.upper_plateau */
+	sc->tpinfo.uplateau = 0x61;
+	SYSCTL_ADD_PROC(&sc->tpinfo.sysctl_ctx,
+	    SYSCTL_CHILDREN(sc->tpinfo.sysctl_tree), OID_AUTO,
+	    "upper_plateau", CTLTYPE_INT|CTLFLAG_RW|CTLFLAG_ANYBODY,
+	    sc, TRACKPOINT_SYSCTL_UPPER_PLATEAU,
+	    trackpoint_sysctl, "I",
+	    "Transfer function upper plateau speed");
+
+	/* hw.psm.trackpoint.backup_range */
+	sc->tpinfo.reach = 0x0a;
+	SYSCTL_ADD_PROC(&sc->tpinfo.sysctl_ctx,
+	    SYSCTL_CHILDREN(sc->tpinfo.sysctl_tree), OID_AUTO,
+	    "backup_range", CTLTYPE_INT|CTLFLAG_RW|CTLFLAG_ANYBODY,
+	    sc, TRACKPOINT_SYSCTL_BACKUP_RANGE,
+	    trackpoint_sysctl, "I",
+	    "Backup range");
+
+	/* hw.psm.trackpoint.drag_hysteresis */
+	sc->tpinfo.draghys = 0xff;
+	SYSCTL_ADD_PROC(&sc->tpinfo.sysctl_ctx,
+	    SYSCTL_CHILDREN(sc->tpinfo.sysctl_tree), OID_AUTO,
+	    "drag_hysteresis", CTLTYPE_INT|CTLFLAG_RW|CTLFLAG_ANYBODY,
+	    sc, TRACKPOINT_SYSCTL_DRAG_HYSTERESIS,
+	    trackpoint_sysctl, "I",
+	    "Drag hysteresis");
+
+	/* hw.psm.trackpoint.minimum_drag */
+	sc->tpinfo.mindrag = 0x14;
+	SYSCTL_ADD_PROC(&sc->tpinfo.sysctl_ctx,
+	    SYSCTL_CHILDREN(sc->tpinfo.sysctl_tree), OID_AUTO,
+	    "minimum_drag", CTLTYPE_INT|CTLFLAG_RW|CTLFLAG_ANYBODY,
+	    sc, TRACKPOINT_SYSCTL_MINIMUM_DRAG,
+	    trackpoint_sysctl, "I",
+	    "Minimum drag");
+
+	/* hw.psm.trackpoint.up_threshold */
+	sc->tpinfo.upthresh = 0xff;
+	SYSCTL_ADD_PROC(&sc->tpinfo.sysctl_ctx,
+	    SYSCTL_CHILDREN(sc->tpinfo.sysctl_tree), OID_AUTO,
+	    "up_threshold", CTLTYPE_INT|CTLFLAG_RW|CTLFLAG_ANYBODY,

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201303191633.r2JGXhtX057604>