Date: Tue, 29 Apr 2014 07:29:14 +0000 (UTC) From: Mark Murray <markm@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r265087 - in projects/random_number_generator: . lib/libc/arm/gen lib/libvmmapi release/doc/en_US.ISO8859-1/relnotes share/man/man4 sys/amd64/include sys/amd64/vmm sys/amd64/vmm/intel s... Message-ID: <201404290729.s3T7TER1099224@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: markm Date: Tue Apr 29 07:29:13 2014 New Revision: 265087 URL: http://svnweb.freebsd.org/changeset/base/265087 Log: MFC - tracking commit Added: projects/random_number_generator/share/man/man4/proto.4 - copied unchanged from r265086, head/share/man/man4/proto.4 projects/random_number_generator/sys/dev/proto/ - copied from r265086, head/sys/dev/proto/ projects/random_number_generator/sys/modules/proto/ - copied from r265086, head/sys/modules/proto/ projects/random_number_generator/tools/bus_space/ - copied from r265086, head/tools/bus_space/ Modified: projects/random_number_generator/Makefile.inc1 projects/random_number_generator/lib/libc/arm/gen/fpsetmask_vfp.c projects/random_number_generator/lib/libvmmapi/vmmapi.c projects/random_number_generator/lib/libvmmapi/vmmapi.h projects/random_number_generator/release/doc/en_US.ISO8859-1/relnotes/article.xml projects/random_number_generator/share/man/man4/Makefile projects/random_number_generator/sys/amd64/include/vmm.h (contents, props changed) projects/random_number_generator/sys/amd64/include/vmm_dev.h (contents, props changed) projects/random_number_generator/sys/amd64/vmm/intel/vmx.c projects/random_number_generator/sys/amd64/vmm/vmm.c projects/random_number_generator/sys/amd64/vmm/vmm_dev.c projects/random_number_generator/sys/boot/amd64/Makefile.inc projects/random_number_generator/sys/geom/geom_disk.c projects/random_number_generator/sys/geom/raid/g_raid.c projects/random_number_generator/sys/geom/raid/md_ddf.c projects/random_number_generator/sys/geom/raid/md_intel.c projects/random_number_generator/sys/geom/raid/md_jmicron.c projects/random_number_generator/sys/geom/raid/md_nvidia.c projects/random_number_generator/sys/geom/raid/md_promise.c projects/random_number_generator/sys/geom/raid/md_sii.c projects/random_number_generator/sys/kern/subr_bus.c projects/random_number_generator/sys/modules/Makefile projects/random_number_generator/usr.sbin/bhyve/bhyverun.c projects/random_number_generator/usr.sbin/bhyve/pci_ahci.c projects/random_number_generator/usr.sbin/bhyvectl/bhyvectl.c projects/random_number_generator/usr.sbin/pmcstat/pmcstat.8 projects/random_number_generator/usr.sbin/pmcstat/pmcstat.c Directory Properties: projects/random_number_generator/ (props changed) projects/random_number_generator/lib/libc/ (props changed) projects/random_number_generator/lib/libvmmapi/ (props changed) projects/random_number_generator/share/man/man4/ (props changed) projects/random_number_generator/sys/ (props changed) projects/random_number_generator/sys/amd64/vmm/ (props changed) projects/random_number_generator/sys/boot/ (props changed) projects/random_number_generator/usr.sbin/bhyve/ (props changed) projects/random_number_generator/usr.sbin/bhyvectl/ (props changed) Modified: projects/random_number_generator/Makefile.inc1 ============================================================================== --- projects/random_number_generator/Makefile.inc1 Tue Apr 29 07:19:22 2014 (r265086) +++ projects/random_number_generator/Makefile.inc1 Tue Apr 29 07:29:13 2014 (r265087) @@ -1480,6 +1480,7 @@ _prebuild_libs= ${_kerberos5_lib_libasn1 ${_secure_lib_libssh} ${_secure_lib_libssl} .if ${MK_GNUCXX} != "no" && ${MK_CXX} != "no" _prebuild_libs+= gnu/lib/libstdc++ gnu/lib/libsupc++ +gnu/lib/libstdc++__L: lib/msun__L .endif .if defined(WITH_ATF) || ${MK_TESTS} != "no" Modified: projects/random_number_generator/lib/libc/arm/gen/fpsetmask_vfp.c ============================================================================== --- projects/random_number_generator/lib/libc/arm/gen/fpsetmask_vfp.c Tue Apr 29 07:19:22 2014 (r265086) +++ projects/random_number_generator/lib/libc/arm/gen/fpsetmask_vfp.c Tue Apr 29 07:29:13 2014 (r265087) @@ -45,7 +45,7 @@ fpsetmask(fp_except_t mask) __asm __volatile("vmrs %0, fpscr" : "=&r"(old)); mask = (mask & FP_X_MASK) << 8; new = (old & ~(FP_X_MASK << 8)) | mask; - __asm __volatile("vmsr fpscr, %0" : : "r"(old)); + __asm __volatile("vmsr fpscr, %0" : : "r"(new)); return ((old >> 8) & FP_X_MASK); } Modified: projects/random_number_generator/lib/libvmmapi/vmmapi.c ============================================================================== --- projects/random_number_generator/lib/libvmmapi/vmmapi.c Tue Apr 29 07:19:22 2014 (r265086) +++ projects/random_number_generator/lib/libvmmapi/vmmapi.c Tue Apr 29 07:29:13 2014 (r265087) @@ -343,10 +343,13 @@ vm_run(struct vmctx *ctx, int vcpu, uint } int -vm_suspend(struct vmctx *ctx) +vm_suspend(struct vmctx *ctx, enum vm_suspend_how how) { + struct vm_suspend vmsuspend; - return (ioctl(ctx->fd, VM_SUSPEND, 0)); + bzero(&vmsuspend, sizeof(vmsuspend)); + vmsuspend.how = how; + return (ioctl(ctx->fd, VM_SUSPEND, &vmsuspend)); } static int Modified: projects/random_number_generator/lib/libvmmapi/vmmapi.h ============================================================================== --- projects/random_number_generator/lib/libvmmapi/vmmapi.h Tue Apr 29 07:19:22 2014 (r265086) +++ projects/random_number_generator/lib/libvmmapi/vmmapi.h Tue Apr 29 07:29:13 2014 (r265087) @@ -61,7 +61,7 @@ int vm_set_register(struct vmctx *ctx, i int vm_get_register(struct vmctx *ctx, int vcpu, int reg, uint64_t *retval); int vm_run(struct vmctx *ctx, int vcpu, uint64_t rip, struct vm_exit *ret_vmexit); -int vm_suspend(struct vmctx *ctx); +int vm_suspend(struct vmctx *ctx, enum vm_suspend_how how); int vm_apicid2vcpu(struct vmctx *ctx, int apicid); int vm_inject_exception(struct vmctx *ctx, int vcpu, int vec); int vm_inject_exception2(struct vmctx *ctx, int vcpu, int vec, int errcode); Modified: projects/random_number_generator/release/doc/en_US.ISO8859-1/relnotes/article.xml ============================================================================== --- projects/random_number_generator/release/doc/en_US.ISO8859-1/relnotes/article.xml Tue Apr 29 07:19:22 2014 (r265086) +++ projects/random_number_generator/release/doc/en_US.ISO8859-1/relnotes/article.xml Tue Apr 29 07:29:13 2014 (r265087) @@ -104,10 +104,6 @@ <sect2 xml:id="kernel"> <title>Kernel Changes</title> - <para revision="263754">The &man.sysctl.8; - <literal>hw.bus.devctl_disable</literal> has been - removed.</para> - <para revision="260903">Support for GPS ports has been added to &man.uhso.4;.</para> Modified: projects/random_number_generator/share/man/man4/Makefile ============================================================================== --- projects/random_number_generator/share/man/man4/Makefile Tue Apr 29 07:19:22 2014 (r265086) +++ projects/random_number_generator/share/man/man4/Makefile Tue Apr 29 07:29:13 2014 (r265087) @@ -378,6 +378,7 @@ MAN= aac.4 \ ppc.4 \ ppi.4 \ procdesc.4 \ + proto.4 \ psm.4 \ pst.4 \ pt.4 \ Copied: projects/random_number_generator/share/man/man4/proto.4 (from r265086, head/share/man/man4/proto.4) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/random_number_generator/share/man/man4/proto.4 Tue Apr 29 07:29:13 2014 (r265087, copy of r265086, head/share/man/man4/proto.4) @@ -0,0 +1,121 @@ +.\" +.\" Copyright (c) 2014 Marcel Moolenaar +.\" All rights reserved. +.\" +.\" 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 ``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 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. +.\" +.\" $FreeBSD$ +.\" +.Dd April 21, 2014 +.Dt PROTO 4 +.Os +.\" +.Sh NAME +.Nm proto +.Nd Driver for prototyping and H/W diagnostics +.\" +.Sh SYNOPSIS +.Cd "device proto" +.\" +.Sh DESCRIPTION +The +.Nm +device driver attaches to PCI devices when no other device drivers are +present and creates device special files for all resources associated +with the device. +The driver itself has no knowledge of the device it attaches to. +Programs can open these device special files and peform register-level +reads and writes. +As such, the +.Nm +device driver is nothing but a conduit or gateway between user space +programs and the hardware device. +.Pp +Examples for why this is useful include hardware diagnostics and prototyping. +In both these use cases, it's far more convenient to develop and run the +logic in user space. +Especially hardware diagnostics requires a somewhat user-friendly interface +and adequate reporting. +Neither is done easily as kernel code. +.\" +.Sh FILES +All device special files corresponding to a PCI device are located under +.Pa /dev/proto/pci<d>:<b>:<s>:<f> +with +.Pa pci<d>:<b>:<s>:<f> +representing the location of the PCI device in the PCI hierarchy. +A location includes: +.Bl -tag -width XXXXXX -compact +.It <d> +The PCI domain number +.It <b> +The PCI bus number +.It <s> +The PCI slot or device number +.It <f> +The PCI function number +.El +.Pp +Every PCI device has a device special file called +.Pa pcicfg . +This device special file gives access to the PCI configuration space. +For each valid base address register (BAR), a device special file is created +that contains the BAR offset and the resource type. +A resource type can be either +.Pa io +or +.Pa mem +representing I/O port or memory mapped I/O space (resp.) +.\" +.Sh EXAMPLES +A single function PCI device in domain 0, on bus 1, in slot 2 and having a +single memory mapped I/O region will have the following device special files: +.Bl -tag -compact +.It Pa /dev/proto/pci0:1:2:0/10.mem +.It Pa /dev/proto/pci0:1:2:0/pcicfg +.El +.\" +.Sh SECURITY CONSIDERATIONS +Because programs have direct access to the hardware, the +.Nm +driver is inherently insecure. +It is not advisable to use this driver on a production machine. +.\" +.Sh MISSING FUNCTIONALITY +The +.Nm +driver does not yet support interrupts. +Since interrupts cannot be handled by the driver itself, they must be converted +into signals and delivered to the program that has registered for interrupts. +.Pp +In order to test the transmission or reception of data, some means of doing +direct memory access (DMA) by the device must be possible. This too much be +under the control of the program. The details of how a program can setup and +initiate DMA still need to be fleshed out. +.Pp +Support for non-PCI devices has not been implemented yet. +.\" +.Sh AUTHORS +The +.Nm +device driver and this manual page were written by +.An Marcel Moolenaar Aq marcel@xcllnt.net . Modified: projects/random_number_generator/sys/amd64/include/vmm.h ============================================================================== --- projects/random_number_generator/sys/amd64/include/vmm.h Tue Apr 29 07:19:22 2014 (r265086) +++ projects/random_number_generator/sys/amd64/include/vmm.h Tue Apr 29 07:29:13 2014 (r265087) @@ -29,6 +29,13 @@ #ifndef _VMM_H_ #define _VMM_H_ +enum vm_suspend_how { + VM_SUSPEND_NONE, + VM_SUSPEND_RESET, + VM_SUSPEND_POWEROFF, + VM_SUSPEND_LAST +}; + #ifdef _KERNEL #define VM_MAX_NAMELEN 32 @@ -115,7 +122,7 @@ int vm_get_seg_desc(struct vm *vm, int v int vm_set_seg_desc(struct vm *vm, int vcpu, int reg, struct seg_desc *desc); int vm_run(struct vm *vm, struct vm_run *vmrun); -int vm_suspend(struct vm *vm); +int vm_suspend(struct vm *vm, enum vm_suspend_how how); int vm_inject_nmi(struct vm *vm, int vcpu); int vm_nmi_pending(struct vm *vm, int vcpuid); void vm_nmi_clear(struct vm *vm, int vcpuid); @@ -134,6 +141,7 @@ int vm_apicid2vcpuid(struct vm *vm, int void vm_activate_cpu(struct vm *vm, int vcpu); cpuset_t vm_active_cpus(struct vm *vm); struct vm_exit *vm_exitinfo(struct vm *vm, int vcpuid); +void vm_exit_suspended(struct vm *vm, int vcpuid, uint64_t rip); /* * Rendezvous all vcpus specified in 'dest' and execute 'func(arg)'. @@ -382,6 +390,9 @@ struct vm_exit { struct { int vector; } ioapic_eoi; + struct { + enum vm_suspend_how how; + } suspended; } u; }; Modified: projects/random_number_generator/sys/amd64/include/vmm_dev.h ============================================================================== --- projects/random_number_generator/sys/amd64/include/vmm_dev.h Tue Apr 29 07:19:22 2014 (r265086) +++ projects/random_number_generator/sys/amd64/include/vmm_dev.h Tue Apr 29 07:29:13 2014 (r265087) @@ -159,6 +159,10 @@ struct vm_hpet_cap { uint32_t capabilities; /* lower 32 bits of HPET capabilities */ }; +struct vm_suspend { + enum vm_suspend_how how; +}; + enum { /* general routines */ IOCNUM_ABIVERS = 0, @@ -214,7 +218,7 @@ enum { #define VM_RUN \ _IOWR('v', IOCNUM_RUN, struct vm_run) #define VM_SUSPEND \ - _IO('v', IOCNUM_SUSPEND) + _IOW('v', IOCNUM_SUSPEND, struct vm_suspend) #define VM_MAP_MEMORY \ _IOWR('v', IOCNUM_MAP_MEMORY, struct vm_memory_segment) #define VM_GET_MEMORY_SEG \ Modified: projects/random_number_generator/sys/amd64/vmm/intel/vmx.c ============================================================================== --- projects/random_number_generator/sys/amd64/vmm/intel/vmx.c Tue Apr 29 07:19:22 2014 (r265086) +++ projects/random_number_generator/sys/amd64/vmm/intel/vmx.c Tue Apr 29 07:29:13 2014 (r265087) @@ -2045,16 +2045,6 @@ vmx_exit_rendezvous(struct vmx *vmx, int } static __inline int -vmx_exit_suspended(struct vmx *vmx, int vcpu, struct vm_exit *vmexit) -{ - - vmexit->rip = vmcs_guest_rip(); - vmexit->inst_length = 0; - vmexit->exitcode = VM_EXITCODE_SUSPENDED; - return (UNHANDLED); -} - -static __inline int vmx_exit_inst_error(struct vmxctx *vmxctx, int rc, struct vm_exit *vmexit) { @@ -2173,7 +2163,8 @@ vmx_run(void *arg, int vcpu, register_t disable_intr(); if (vcpu_suspended(suspend_cookie)) { enable_intr(); - handled = vmx_exit_suspended(vmx, vcpu, vmexit); + vm_exit_suspended(vmx->vm, vcpu, vmcs_guest_rip()); + handled = UNHANDLED; break; } Modified: projects/random_number_generator/sys/amd64/vmm/vmm.c ============================================================================== --- projects/random_number_generator/sys/amd64/vmm/vmm.c Tue Apr 29 07:19:22 2014 (r265086) +++ projects/random_number_generator/sys/amd64/vmm/vmm.c Tue Apr 29 07:29:13 2014 (r265087) @@ -1211,16 +1211,45 @@ vm_handle_suspend(struct vm *vm, int vcp } int -vm_suspend(struct vm *vm) +vm_suspend(struct vm *vm, enum vm_suspend_how how) { + int i; - if (atomic_cmpset_int(&vm->suspend, 0, 1)) { - VM_CTR0(vm, "virtual machine suspended"); - return (0); - } else { - VM_CTR0(vm, "virtual machine already suspended"); + if (how <= VM_SUSPEND_NONE || how >= VM_SUSPEND_LAST) + return (EINVAL); + + if (atomic_cmpset_int(&vm->suspend, 0, how) == 0) { + VM_CTR2(vm, "virtual machine already suspended %d/%d", + vm->suspend, how); return (EALREADY); } + + VM_CTR1(vm, "virtual machine successfully suspended %d", how); + + /* + * Notify all active vcpus that they are now suspended. + */ + for (i = 0; i < VM_MAXCPU; i++) { + if (CPU_ISSET(i, &vm->active_cpus)) + vcpu_notify_event(vm, i, false); + } + + return (0); +} + +void +vm_exit_suspended(struct vm *vm, int vcpuid, uint64_t rip) +{ + struct vm_exit *vmexit; + + KASSERT(vm->suspend > VM_SUSPEND_NONE && vm->suspend < VM_SUSPEND_LAST, + ("vm_exit_suspended: invalid suspend type %d", vm->suspend)); + + vmexit = vm_exitinfo(vm, vcpuid); + vmexit->rip = rip; + vmexit->inst_length = 0; + vmexit->exitcode = VM_EXITCODE_SUSPENDED; + vmexit->u.suspended.how = vm->suspend; } int Modified: projects/random_number_generator/sys/amd64/vmm/vmm_dev.c ============================================================================== --- projects/random_number_generator/sys/amd64/vmm/vmm_dev.c Tue Apr 29 07:19:22 2014 (r265086) +++ projects/random_number_generator/sys/amd64/vmm/vmm_dev.c Tue Apr 29 07:29:13 2014 (r265087) @@ -166,6 +166,7 @@ vmmdev_ioctl(struct cdev *cdev, u_long c struct vm_stat_desc *statdesc; struct vm_x2apic *x2apic; struct vm_gpa_pte *gpapte; + struct vm_suspend *vmsuspend; sc = vmmdev_lookup2(cdev); if (sc == NULL) @@ -241,7 +242,8 @@ vmmdev_ioctl(struct cdev *cdev, u_long c error = vm_run(sc->vm, vmrun); break; case VM_SUSPEND: - error = vm_suspend(sc->vm); + vmsuspend = (struct vm_suspend *)data; + error = vm_suspend(sc->vm, vmsuspend->how); break; case VM_STAT_DESC: { statdesc = (struct vm_stat_desc *)data; Modified: projects/random_number_generator/sys/boot/amd64/Makefile.inc ============================================================================== --- projects/random_number_generator/sys/boot/amd64/Makefile.inc Tue Apr 29 07:19:22 2014 (r265086) +++ projects/random_number_generator/sys/boot/amd64/Makefile.inc Tue Apr 29 07:29:13 2014 (r265087) @@ -4,8 +4,9 @@ BINDIR?= /boot +# See conf/kern.mk for the correct set of these CFLAGS+= -ffreestanding -CFLAGS+= -mno-mmx -mno-3dnow -mno-sse -mno-sse2 -mno-sse3 -msoft-float +CFLAGS+= -mno-mmx -mno-sse -mno-aes -mno-avx -msoft-float LDFLAGS+= -nostdlib .include "../Makefile.inc" Modified: projects/random_number_generator/sys/geom/geom_disk.c ============================================================================== --- projects/random_number_generator/sys/geom/geom_disk.c Tue Apr 29 07:19:22 2014 (r265086) +++ projects/random_number_generator/sys/geom/geom_disk.c Tue Apr 29 07:29:13 2014 (r265087) @@ -47,7 +47,6 @@ __FBSDID("$FreeBSD$"); #include <sys/fcntl.h> #include <sys/malloc.h> #include <sys/sbuf.h> -#include <sys/sysctl.h> #include <sys/devicestat.h> #include <machine/md_var.h> Modified: projects/random_number_generator/sys/geom/raid/g_raid.c ============================================================================== --- projects/random_number_generator/sys/geom/raid/g_raid.c Tue Apr 29 07:19:22 2014 (r265086) +++ projects/random_number_generator/sys/geom/raid/g_raid.c Tue Apr 29 07:29:13 2014 (r265087) @@ -2251,6 +2251,8 @@ g_raid_taste(struct g_class *mp, struct return (NULL); G_RAID_DEBUG(2, "Tasting provider %s.", pp->name); + geom = NULL; + status = G_RAID_MD_TASTE_FAIL; gp = g_new_geomf(mp, "raid:taste"); /* * This orphan function should be never called. @@ -2259,8 +2261,9 @@ g_raid_taste(struct g_class *mp, struct cp = g_new_consumer(gp); cp->flags |= G_CF_DIRECT_RECEIVE; g_attach(cp, pp); + if (g_access(cp, 1, 0, 0) != 0) + goto ofail; - geom = NULL; LIST_FOREACH(class, &g_raid_md_classes, mdc_list) { if (!class->mdc_enable) continue; @@ -2276,6 +2279,9 @@ g_raid_taste(struct g_class *mp, struct break; } + if (status == G_RAID_MD_TASTE_FAIL) + (void)g_access(cp, -1, 0, 0); +ofail: g_detach(cp); g_destroy_consumer(cp); g_destroy_geom(gp); Modified: projects/random_number_generator/sys/geom/raid/md_ddf.c ============================================================================== --- projects/random_number_generator/sys/geom/raid/md_ddf.c Tue Apr 29 07:19:22 2014 (r265086) +++ projects/random_number_generator/sys/geom/raid/md_ddf.c Tue Apr 29 07:29:13 2014 (r265087) @@ -2120,13 +2120,10 @@ g_raid_md_taste_ddf(struct g_raid_md_obj pp = cp->provider; /* Read metadata from device. */ - if (g_access(cp, 1, 0, 0) != 0) - return (G_RAID_MD_TASTE_FAIL); g_topology_unlock(); bzero(&meta, sizeof(meta)); error = ddf_meta_read(cp, &meta); g_topology_lock(); - g_access(cp, -1, 0, 0); if (error != 0) return (G_RAID_MD_TASTE_FAIL); be = meta.bigendian; @@ -2164,6 +2161,9 @@ g_raid_md_taste_ddf(struct g_raid_md_obj geom = sc->sc_geom; } + /* There is no return after this point, so we close passed consumer. */ + g_access(cp, -1, 0, 0); + rcp = g_new_consumer(geom); rcp->flags |= G_CF_DIRECT_RECEIVE; g_attach(rcp, pp); Modified: projects/random_number_generator/sys/geom/raid/md_intel.c ============================================================================== --- projects/random_number_generator/sys/geom/raid/md_intel.c Tue Apr 29 07:19:22 2014 (r265086) +++ projects/random_number_generator/sys/geom/raid/md_intel.c Tue Apr 29 07:29:13 2014 (r265087) @@ -1382,8 +1382,6 @@ g_raid_md_taste_intel(struct g_raid_md_o meta = NULL; vendor = 0xffff; disk_pos = 0; - if (g_access(cp, 1, 0, 0) != 0) - return (G_RAID_MD_TASTE_FAIL); g_topology_unlock(); error = g_raid_md_get_label(cp, serial, sizeof(serial)); if (error != 0) { @@ -1396,7 +1394,6 @@ g_raid_md_taste_intel(struct g_raid_md_o g_io_getattr("GEOM::hba_vendor", cp, &len, &vendor); meta = intel_meta_read(cp); g_topology_lock(); - g_access(cp, -1, 0, 0); if (meta == NULL) { if (g_raid_aggressive_spare) { if (vendor != 0x8086) { @@ -1476,6 +1473,9 @@ search: G_RAID_DEBUG1(1, sc, "root_mount_hold %p", mdi->mdio_rootmount); } + /* There is no return after this point, so we close passed consumer. */ + g_access(cp, -1, 0, 0); + rcp = g_new_consumer(geom); rcp->flags |= G_CF_DIRECT_RECEIVE; g_attach(rcp, pp); @@ -1512,7 +1512,6 @@ search: return (result); fail2: g_topology_lock(); - g_access(cp, -1, 0, 0); fail1: free(meta, M_MD_INTEL); return (G_RAID_MD_TASTE_FAIL); Modified: projects/random_number_generator/sys/geom/raid/md_jmicron.c ============================================================================== --- projects/random_number_generator/sys/geom/raid/md_jmicron.c Tue Apr 29 07:19:22 2014 (r265086) +++ projects/random_number_generator/sys/geom/raid/md_jmicron.c Tue Apr 29 07:29:13 2014 (r265087) @@ -837,15 +837,12 @@ g_raid_md_taste_jmicron(struct g_raid_md /* Read metadata from device. */ meta = NULL; vendor = 0xffff; - if (g_access(cp, 1, 0, 0) != 0) - return (G_RAID_MD_TASTE_FAIL); g_topology_unlock(); len = 2; if (pp->geom->rank == 1) g_io_getattr("GEOM::hba_vendor", cp, &len, &vendor); meta = jmicron_meta_read(cp); g_topology_lock(); - g_access(cp, -1, 0, 0); if (meta == NULL) { if (g_raid_aggressive_spare) { if (vendor == 0x197b) { @@ -922,6 +919,9 @@ search: G_RAID_DEBUG1(1, sc, "root_mount_hold %p", mdi->mdio_rootmount); } + /* There is no return after this point, so we close passed consumer. */ + g_access(cp, -1, 0, 0); + rcp = g_new_consumer(geom); rcp->flags |= G_CF_DIRECT_RECEIVE; g_attach(rcp, pp); Modified: projects/random_number_generator/sys/geom/raid/md_nvidia.c ============================================================================== --- projects/random_number_generator/sys/geom/raid/md_nvidia.c Tue Apr 29 07:19:22 2014 (r265086) +++ projects/random_number_generator/sys/geom/raid/md_nvidia.c Tue Apr 29 07:29:13 2014 (r265087) @@ -841,15 +841,12 @@ g_raid_md_taste_nvidia(struct g_raid_md_ /* Read metadata from device. */ meta = NULL; vendor = 0xffff; - if (g_access(cp, 1, 0, 0) != 0) - return (G_RAID_MD_TASTE_FAIL); g_topology_unlock(); len = 2; if (pp->geom->rank == 1) g_io_getattr("GEOM::hba_vendor", cp, &len, &vendor); meta = nvidia_meta_read(cp); g_topology_lock(); - g_access(cp, -1, 0, 0); if (meta == NULL) { if (g_raid_aggressive_spare) { if (vendor == 0x10de) { @@ -918,6 +915,9 @@ search: G_RAID_DEBUG1(1, sc, "root_mount_hold %p", mdi->mdio_rootmount); } + /* There is no return after this point, so we close passed consumer. */ + g_access(cp, -1, 0, 0); + rcp = g_new_consumer(geom); rcp->flags |= G_CF_DIRECT_RECEIVE; g_attach(rcp, pp); Modified: projects/random_number_generator/sys/geom/raid/md_promise.c ============================================================================== --- projects/random_number_generator/sys/geom/raid/md_promise.c Tue Apr 29 07:19:22 2014 (r265086) +++ projects/random_number_generator/sys/geom/raid/md_promise.c Tue Apr 29 07:29:13 2014 (r265087) @@ -1106,15 +1106,12 @@ g_raid_md_taste_promise(struct g_raid_md /* Read metadata from device. */ meta = NULL; vendor = 0xffff; - if (g_access(cp, 1, 0, 0) != 0) - return (G_RAID_MD_TASTE_FAIL); g_topology_unlock(); len = 2; if (pp->geom->rank == 1) g_io_getattr("GEOM::hba_vendor", cp, &len, &vendor); subdisks = promise_meta_read(cp, metaarr); g_topology_lock(); - g_access(cp, -1, 0, 0); if (subdisks == 0) { if (g_raid_aggressive_spare) { if (vendor == 0x105a || vendor == 0x1002) { @@ -1175,6 +1172,9 @@ search: geom = sc->sc_geom; } + /* There is no return after this point, so we close passed consumer. */ + g_access(cp, -1, 0, 0); + rcp = g_new_consumer(geom); rcp->flags |= G_CF_DIRECT_RECEIVE; g_attach(rcp, pp); Modified: projects/random_number_generator/sys/geom/raid/md_sii.c ============================================================================== --- projects/random_number_generator/sys/geom/raid/md_sii.c Tue Apr 29 07:19:22 2014 (r265086) +++ projects/random_number_generator/sys/geom/raid/md_sii.c Tue Apr 29 07:29:13 2014 (r265087) @@ -923,15 +923,12 @@ g_raid_md_taste_sii(struct g_raid_md_obj /* Read metadata from device. */ meta = NULL; vendor = 0xffff; - if (g_access(cp, 1, 0, 0) != 0) - return (G_RAID_MD_TASTE_FAIL); g_topology_unlock(); len = 2; if (pp->geom->rank == 1) g_io_getattr("GEOM::hba_vendor", cp, &len, &vendor); meta = sii_meta_read(cp); g_topology_lock(); - g_access(cp, -1, 0, 0); if (meta == NULL) { if (g_raid_aggressive_spare) { if (vendor == 0x1095) { @@ -1011,6 +1008,9 @@ search: G_RAID_DEBUG1(1, sc, "root_mount_hold %p", mdi->mdio_rootmount); } + /* There is no return after this point, so we close passed consumer. */ + g_access(cp, -1, 0, 0); + rcp = g_new_consumer(geom); rcp->flags |= G_CF_DIRECT_RECEIVE; g_attach(rcp, pp); Modified: projects/random_number_generator/sys/kern/subr_bus.c ============================================================================== --- projects/random_number_generator/sys/kern/subr_bus.c Tue Apr 29 07:19:22 2014 (r265086) +++ projects/random_number_generator/sys/kern/subr_bus.c Tue Apr 29 07:29:13 2014 (r265087) @@ -355,6 +355,13 @@ device_sysctl_fini(device_t dev) * tested since 3.4 or 2.2.8! */ +/* Deprecated way to adjust queue length */ +static int sysctl_devctl_disable(SYSCTL_HANDLER_ARGS); +/* XXX Need to support old-style tunable hw.bus.devctl_disable" */ +SYSCTL_PROC(_hw_bus, OID_AUTO, devctl_disable, CTLTYPE_INT | CTLFLAG_RW | + CTLFLAG_MPSAFE, NULL, 0, sysctl_devctl_disable, "I", + "devctl disable -- deprecated"); + #define DEVCTL_DEFAULT_QUEUE_LEN 1000 static int sysctl_devctl_queue(SYSCTL_HANDLER_ARGS); static int devctl_queue_length = DEVCTL_DEFAULT_QUEUE_LEN; @@ -685,9 +692,9 @@ devctl_notify(const char *system, const * Common routine that tries to make sending messages as easy as possible. * We allocate memory for the data, copy strings into that, but do not * free it unless there's an error. The dequeue part of the driver should - * free the data. We don't send data when queue length is 0. We do send - * data, even when we have no listeners, because we wish to avoid races - * relating to startup and restart of listening applications. + * free the data. We don't send data when the device is disabled. We do + * send data, even when we have no listeners, because we wish to avoid + * races relating to startup and restart of listening applications. * * devaddq is designed to string together the type of event, with the * object of that event, plus the plug and play info and location info @@ -779,6 +786,33 @@ devnomatch(device_t dev) } static int +sysctl_devctl_disable(SYSCTL_HANDLER_ARGS) +{ + struct dev_event_info *n1; + int dis, error; + + dis = devctl_queue_length == 0; + error = sysctl_handle_int(oidp, &dis, 0, req); + if (error || !req->newptr) + return (error); + mtx_lock(&devsoftc.mtx); + if (dis) { + while (!TAILQ_EMPTY(&devsoftc.devq)) { + n1 = TAILQ_FIRST(&devsoftc.devq); + TAILQ_REMOVE(&devsoftc.devq, n1, dei_link); + free(n1->dei_data, M_BUS); + free(n1, M_BUS); + } + devsoftc.queued = 0; + devctl_queue_length = 0; + } else { + devctl_queue_length = DEVCTL_DEFAULT_QUEUE_LEN; + } + mtx_unlock(&devsoftc.mtx); + return (0); +} + +static int sysctl_devctl_queue(SYSCTL_HANDLER_ARGS) { struct dev_event_info *n1; Modified: projects/random_number_generator/sys/modules/Makefile ============================================================================== --- projects/random_number_generator/sys/modules/Makefile Tue Apr 29 07:19:22 2014 (r265086) +++ projects/random_number_generator/sys/modules/Makefile Tue Apr 29 07:29:13 2014 (r265087) @@ -273,6 +273,7 @@ SUBDIR= \ ppi \ pps \ procfs \ + proto \ pseudofs \ ${_pst} \ pty \ Modified: projects/random_number_generator/usr.sbin/bhyve/bhyverun.c ============================================================================== --- projects/random_number_generator/usr.sbin/bhyve/bhyverun.c Tue Apr 29 07:19:22 2014 (r265086) +++ projects/random_number_generator/usr.sbin/bhyve/bhyverun.c Tue Apr 29 07:29:13 2014 (r265087) @@ -461,17 +461,18 @@ vmexit_inst_emul(struct vmctx *ctx, stru static pthread_mutex_t resetcpu_mtx = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t resetcpu_cond = PTHREAD_COND_INITIALIZER; -static int resetcpu = -1; static int vmexit_suspend(struct vmctx *ctx, struct vm_exit *vmexit, int *pvcpu) { - - assert(resetcpu != -1); + enum vm_suspend_how how; + + how = vmexit->u.suspended.how; + assert(how == VM_SUSPEND_RESET || how == VM_SUSPEND_POWEROFF); fbsdrun_deletecpu(ctx, *pvcpu); - if (*pvcpu != resetcpu) { + if (*pvcpu != BSP) { pthread_mutex_lock(&resetcpu_mtx); pthread_cond_signal(&resetcpu_cond); pthread_mutex_unlock(&resetcpu_mtx); @@ -483,7 +484,12 @@ vmexit_suspend(struct vmctx *ctx, struct pthread_cond_wait(&resetcpu_cond, &resetcpu_mtx); } pthread_mutex_unlock(&resetcpu_mtx); - exit(0); + + if (how == VM_SUSPEND_RESET) + exit(0); + if (how == VM_SUSPEND_POWEROFF) + exit(1); + return (0); /* NOTREACHED */ } static vmexit_handler_t handler[VM_EXITCODE_MAX] = { @@ -505,6 +511,7 @@ vm_loop(struct vmctx *ctx, int vcpu, uin cpuset_t mask; int error, rc, prevcpu; enum vm_exitcode exitcode; + enum vm_suspend_how how; if (pincpu >= 0) { CPU_ZERO(&mask); @@ -538,10 +545,13 @@ vm_loop(struct vmctx *ctx, int vcpu, uin rip = vmexit[vcpu].rip; break; case VMEXIT_RESET: - if (vm_suspend(ctx) == 0) { - assert(resetcpu == -1); - resetcpu = vcpu; - } + case VMEXIT_POWEROFF: + if (rc == VMEXIT_RESET) + how = VM_SUSPEND_RESET; + else + how = VM_SUSPEND_POWEROFF; + error = vm_suspend(ctx, how); + assert(error == 0 || errno == EALREADY); rip = vmexit[vcpu].rip + vmexit[vcpu].inst_length; break; default: Modified: projects/random_number_generator/usr.sbin/bhyve/pci_ahci.c ============================================================================== --- projects/random_number_generator/usr.sbin/bhyve/pci_ahci.c Tue Apr 29 07:19:22 2014 (r265086) +++ projects/random_number_generator/usr.sbin/bhyve/pci_ahci.c Tue Apr 29 07:29:13 2014 (r265087) @@ -192,6 +192,7 @@ struct pci_ahci_softc { uint32_t em_ctl; uint32_t cap2; uint32_t bohc; + uint32_t lintr; struct ahci_port port[MAX_PORTS]; }; #define ahci_ctx(sc) ((sc)->asc_pi->pi_vmctx) @@ -211,8 +212,11 @@ static inline void lba_to_msf(uint8_t *b static void ahci_generate_intr(struct pci_ahci_softc *sc) { + struct pci_devinst *pi; int i; + pi = sc->asc_pi; + for (i = 0; i < sc->ports; i++) { struct ahci_port *pr; pr = &sc->port[i]; @@ -222,8 +226,28 @@ ahci_generate_intr(struct pci_ahci_softc DPRINTF("%s %x\n", __func__, sc->is); - if (sc->is && (sc->ghc & AHCI_GHC_IE)) - pci_generate_msi(sc->asc_pi, 0); + if (sc->is && (sc->ghc & AHCI_GHC_IE)) { + if (pci_msi_enabled(pi)) { + /* + * Generate an MSI interrupt on every edge + */ + pci_generate_msi(pi, 0); + } else if (!sc->lintr) { + /* + * Only generate a pin-based interrupt if one wasn't + * in progress + */ + sc->lintr = 1; + pci_lintr_assert(pi); + } + } else if (sc->lintr) { + /* + * No interrupts: deassert pin-based signal if it had + * been asserted + */ + pci_lintr_deassert(pi); + sc->lintr = 0; + } } static void @@ -367,6 +391,12 @@ ahci_reset(struct pci_ahci_softc *sc) sc->ghc = AHCI_GHC_AE; sc->is = 0; + + if (sc->lintr) { + pci_lintr_deassert(sc->asc_pi); + sc->lintr = 0; + } + for (i = 0; i < sc->ports; i++) { sc->port[i].ie = 0; sc->port[i].is = 0; @@ -1814,6 +1844,8 @@ pci_ahci_init(struct vmctx *ctx, struct pci_emul_alloc_bar(pi, 5, PCIBAR_MEM32, AHCI_OFFSET + sc->ports * AHCI_STEP); + pci_lintr_request(pi); + open_fail: if (ret) { blockif_close(sc->port[0].bctx); Modified: projects/random_number_generator/usr.sbin/bhyvectl/bhyvectl.c ============================================================================== --- projects/random_number_generator/usr.sbin/bhyvectl/bhyvectl.c Tue Apr 29 07:19:22 2014 (r265086) +++ projects/random_number_generator/usr.sbin/bhyvectl/bhyvectl.c Tue Apr 29 07:29:13 2014 (r265087) @@ -191,13 +191,16 @@ usage(void) " [--get-highmem]\n" " [--get-gpa-pmap]\n" " [--assert-lapic-lvt=<pin>]\n" - " [--inject-nmi]\n", + " [--inject-nmi]\n" + " [--force-reset]\n" + " [--force-poweroff]\n", progname); exit(1); } static int get_stats, getcap, setcap, capval, get_gpa_pmap; static int inject_nmi, assert_lapic_lvt; +static int force_reset, force_poweroff; static const char *capname; static int create, destroy, get_lowmem, get_highmem; static uint64_t memsize; @@ -565,6 +568,8 @@ main(int argc, char *argv[]) { "create", NO_ARG, &create, 1 }, { "destroy", NO_ARG, &destroy, 1 }, { "inject-nmi", NO_ARG, &inject_nmi, 1 }, + { "force-reset", NO_ARG, &force_reset, 1 }, + { "force-poweroff", NO_ARG, &force_poweroff, 1 }, { NULL, 0, NULL, 0 } }; @@ -1535,6 +1540,12 @@ main(int argc, char *argv[]) printf("vm_run error %d\n", error); } + if (!error && force_reset) + error = vm_suspend(ctx, VM_SUSPEND_RESET); + + if (!error && force_poweroff) + error = vm_suspend(ctx, VM_SUSPEND_POWEROFF); + if (error) printf("errno = %d\n", errno); Modified: projects/random_number_generator/usr.sbin/pmcstat/pmcstat.8 ============================================================================== --- projects/random_number_generator/usr.sbin/pmcstat/pmcstat.8 Tue Apr 29 07:19:22 2014 (r265086) +++ projects/random_number_generator/usr.sbin/pmcstat/pmcstat.8 Tue Apr 29 07:29:13 2014 (r265087) @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd September 19, 2008 +.Dd April 29, 2014 .Dt PMCSTAT 8 .Os .Sh NAME @@ -46,6 +46,7 @@ .Op Fl S Ar event-spec .Op Fl T .Op Fl W +.Op Fl a Ar pathname .Op Fl c Ar cpu-spec .Op Fl d .Op Fl f Ar pluginopt @@ -221,6 +222,21 @@ This is an experimental feature intended dynamic behaviour of processes in the system. It may incur substantial overhead if enabled. The default is for this feature to be disabled. +.It Fl a Ar pathname +Perform a symbol and file:line lookup for each address in each +callgraph and save the output to +.Ar pathname . +Unlike +.Fl m +that only resolves the first symbol in the graph, this resolves +every node in the callgraph, or prints out addresses if no +lookup information is available. +This option requires the +.Fl R +option to read in samples that were previously collected and +saved with the +.Fl o +option. .It Fl c Ar cpu-spec Set the cpus for subsequent system mode PMCs specified on the command line to Modified: projects/random_number_generator/usr.sbin/pmcstat/pmcstat.c ============================================================================== --- projects/random_number_generator/usr.sbin/pmcstat/pmcstat.c Tue Apr 29 07:19:22 2014 (r265086) +++ projects/random_number_generator/usr.sbin/pmcstat/pmcstat.c Tue Apr 29 07:29:13 2014 (r265087) @@ -503,7 +503,7 @@ pmcstat_show_usage(void) "\t -S spec\t allocate a system-wide sampling PMC\n" "\t -T\t\t start in top mode\n" "\t -W\t\t (toggle) show counts per context switch\n" - "\t -a <file>\t print sampled PCs and callgraph to \"file\"\n" + "\t -a file\t print sampled PCs and callgraph to \"file\"\n" "\t -c cpu-list\t set cpus for subsequent system-wide PMCs\n" "\t -d\t\t (toggle) track descendants\n" "\t -f spec\t pass \"spec\" to as plugin option\n"
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201404290729.s3T7TER1099224>