From owner-svn-src-user@FreeBSD.ORG Tue Mar 19 16:33:49 2013 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 5FFA4923; Tue, 19 Mar 2013 16:33:49 +0000 (UTC) (envelope-from attilio@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 33DF434F; Tue, 19 Mar 2013 16:33:49 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.6/8.14.6) with ESMTP id r2JGXnMR057643; Tue, 19 Mar 2013 16:33:49 GMT (envelope-from attilio@svn.freebsd.org) Received: (from attilio@localhost) by svn.freebsd.org (8.14.6/8.14.5/Submit) id r2JGXhtX057604; Tue, 19 Mar 2013 16:33:43 GMT (envelope-from attilio@svn.freebsd.org) Message-Id: <201303191633.r2JGXhtX057604@svn.freebsd.org> From: Attilio Rao Date: Tue, 19 Mar 2013 16:33:43 +0000 (UTC) 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... X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 19 Mar 2013 16:33:49 -0000 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 #include - /* 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 ***