Module Name: src Committed By: martin Date: Sun Nov 2 10:09:44 UTC 2014
Modified Files: src/doc [netbsd-7]: CHANGES src/sys/arch/amd64/conf [netbsd-7]: GENERIC src/sys/dev/pci [netbsd-7]: files.pci Added Files: src/share/man/man4 [netbsd-7]: viornd.4 src/sys/dev/pci [netbsd-7]: viornd.c Log Message: Pull up following revision(s) (requested by tls in ticket #174): doc/CHANGES: revision 1.2005 sys/dev/pci/viornd.c: revision 1.1 sys/dev/pci/files.pci: revision 1.372 sys/arch/amd64/conf/GENERIC: revision 1.401 share/man/man4/viornd.4: revision 1.1 Add viornd(4), a driver for the VirtIO entropy source available on QEMU, KVM, and Google Compute Engine. From OpenBSD. To generate a diff of this commit: cvs rdiff -u -r1.1967.2.5 -r1.1967.2.6 src/doc/CHANGES cvs rdiff -u -r0 -r1.2.2.2 src/share/man/man4/viornd.4 cvs rdiff -u -r1.392.2.1 -r1.392.2.2 src/sys/arch/amd64/conf/GENERIC cvs rdiff -u -r1.371 -r1.371.4.1 src/sys/dev/pci/files.pci cvs rdiff -u -r0 -r1.1.2.2 src/sys/dev/pci/viornd.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/doc/CHANGES diff -u src/doc/CHANGES:1.1967.2.5 src/doc/CHANGES:1.1967.2.6 --- src/doc/CHANGES:1.1967.2.5 Sun Nov 2 09:57:12 2014 +++ src/doc/CHANGES Sun Nov 2 10:09:44 2014 @@ -1,4 +1,4 @@ -# LIST OF CHANGES FROM LAST RELEASE: <$Revision: 1.1967.2.5 $> +# LIST OF CHANGES FROM LAST RELEASE: <$Revision: 1.1967.2.6 $> # # # [Note: This file does not mention every change made to the NetBSD source tree. @@ -21,7 +21,7 @@ # # See htutils/changes/changes2html script for more details. # -LIST OF CHANGES FROM PREVIOUS RELEASES: <$Revision: 1.1967.2.5 $> +LIST OF CHANGES FROM PREVIOUS RELEASES: <$Revision: 1.1967.2.6 $> Changes from NetBSD 6.0 to NetBSD 7.0: @@ -516,4 +516,5 @@ Changes from NetBSD 6.0 to NetBSD 7.0: is entropy demand. [tls 20141026] rnd(9): Adjust entropy collection from polled sources so it's processed sooner. [tls 20141026] - + viornd(4): Add driver for VirtIO entropy source available on + QEMU, KVM, and Google Compute Engine. From OpenBSD. Index: src/sys/arch/amd64/conf/GENERIC diff -u src/sys/arch/amd64/conf/GENERIC:1.392.2.1 src/sys/arch/amd64/conf/GENERIC:1.392.2.2 --- src/sys/arch/amd64/conf/GENERIC:1.392.2.1 Fri Oct 10 18:16:36 2014 +++ src/sys/arch/amd64/conf/GENERIC Sun Nov 2 10:09:44 2014 @@ -1,4 +1,4 @@ -# $NetBSD: GENERIC,v 1.392.2.1 2014/10/10 18:16:36 snj Exp $ +# $NetBSD: GENERIC,v 1.392.2.2 2014/11/02 10:09:44 martin Exp $ # # GENERIC machine description file # @@ -22,7 +22,7 @@ include "arch/amd64/conf/std.amd64" options INCLUDE_CONFIG_FILE # embed config file in kernel binary -#ident "GENERIC-$Revision: 1.392.2.1 $" +#ident "GENERIC-$Revision: 1.392.2.2 $" maxusers 64 # estimated number of users @@ -1167,6 +1167,7 @@ virtio* at pci? dev ? function ? # Virti viomb* at virtio? # Virtio memory balloon device ld* at virtio? # Virtio disk device vioif* at virtio? # Virtio network device +viornd* at virtio? # Virtio entropy device # Pull in optional local configuration Index: src/sys/dev/pci/files.pci diff -u src/sys/dev/pci/files.pci:1.371 src/sys/dev/pci/files.pci:1.371.4.1 --- src/sys/dev/pci/files.pci:1.371 Wed Mar 19 15:26:41 2014 +++ src/sys/dev/pci/files.pci Sun Nov 2 10:09:44 2014 @@ -1,4 +1,4 @@ -# $NetBSD: files.pci,v 1.371 2014/03/19 15:26:41 nonaka Exp $ +# $NetBSD: files.pci,v 1.371.4.1 2014/11/02 10:09:44 martin Exp $ # # Config file and device description for machine-independent PCI code. # Included by ports that need it. Requires that the SCSI files be @@ -1125,6 +1125,10 @@ device vioif attach vioif at virtio file dev/pci/if_vioif.c vioif +device viornd +attach viornd at virtio +file dev/pci/viornd.c viornd + # Silicon Motion SM712(LynxEM+) frame buffer device lynxfb: wsemuldisplaydev, rasops16 attach lynxfb at pci Added files: Index: src/share/man/man4/viornd.4 diff -u /dev/null src/share/man/man4/viornd.4:1.2.2.2 --- /dev/null Sun Nov 2 10:09:44 2014 +++ src/share/man/man4/viornd.4 Sun Nov 2 10:09:44 2014 @@ -0,0 +1,61 @@ +.\" $NetBSD: viornd.4,v 1.2.2.2 2014/11/02 10:09:44 martin Exp $ +.\" +.\" Copyright (c) 2014 The NetBSD Foundation, Inc. +.\" All rights reserved. +.\" +.\" This code is derived from software contributed to The NetBSD Foundation +.\" by Thor Lancelot Simon. +.\" +.\" 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS +.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS +.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +.\" POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd October 26, 2014 +.Dt VIORND 4 +.Os +.Sh NAME +.Nm viornd +.Nd VirtIO entropy source +.Sh SYNOPSIS +.Cd "viornd* at virtio?" +.Sh DESCRIPTION +When the system has entropy demand, +the +.Nm +driver, used with a compatible hypervisor such as QEMU, KVM, or Google +Compute Engine, requests entropy using the VirtIO random number interface +and feeds it into the system entropy pool. +.Sh SEE ALSO +.Xr virtio 4 , +.Xr rnd 4 +.Sh HISTORY +The +.Nm +driver appeared in +.Ox 5.5 . +.Sh AUTHORS +The +.Nm +driver was written by Stephan Fritsch <s...@fritsch.de> and reworked to +request entropy upon demand by Thor Lancelot Simon <t...@netbsd.org>. +.Sh CAVEATS +VirtIO appears to support at least 8 pending entropy requests, but +.Nm +currently supports only one pending request at a time. Index: src/sys/dev/pci/viornd.c diff -u /dev/null src/sys/dev/pci/viornd.c:1.1.2.2 --- /dev/null Sun Nov 2 10:09:44 2014 +++ src/sys/dev/pci/viornd.c Sun Nov 2 10:09:44 2014 @@ -0,0 +1,249 @@ +/* $NetBSD: viornd.c,v 1.1.2.2 2014/11/02 10:09:44 martin Exp $ */ +/* $OpenBSD: viornd.c,v 1.1 2014/01/21 21:14:58 sf Exp $ */ + +/* + * Copyright (c) 2014 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Thor Lancelot Simon (t...@netbsd.org). + * + * 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Copyright (c) 2014 Stefan Fritsch <s...@sfritsch.de> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/device.h> +#include <sys/callout.h> +#include <sys/rnd.h> +#include <sys/mutex.h> +#include <dev/pci/pcidevs.h> +#include <dev/pci/pcivar.h> +#include <dev/pci/pcivar.h> +#include <dev/pci/virtioreg.h> +#include <dev/pci/virtiovar.h> + +#define VIORND_BUFSIZE 32 + +#define VIORND_DEBUG 1 + +struct viornd_softc { + device_t sc_dev; + struct virtio_softc *sc_virtio; + + kmutex_t sc_mutex; + bool sc_active; + + void *sc_buf; + struct virtqueue sc_vq; + bus_dmamap_t sc_dmamap; + krndsource_t sc_rndsource; +}; + +int viornd_match(device_t, cfdata_t, void *); +void viornd_attach(device_t, device_t, void *); +int viornd_vq_done(struct virtqueue *); + +CFATTACH_DECL_NEW(viornd, sizeof(struct viornd_softc), + viornd_match, viornd_attach, NULL, NULL); + +static void +viornd_get(size_t bytes, void *priv) +{ + struct viornd_softc *sc = priv; + struct virtio_softc *vsc = sc->sc_virtio; + struct virtqueue *vq = &sc->sc_vq; + int slot; + + aprint_normal("%s: asked for %d bytes of entropy\n", __func__, + VIORND_BUFSIZE); + mutex_enter(&sc->sc_mutex); + + if (sc->sc_active) { + goto out; + } + + bus_dmamap_sync(vsc->sc_dmat, sc->sc_dmamap, 0, VIORND_BUFSIZE, + BUS_DMASYNC_PREREAD); + if (virtio_enqueue_prep(vsc, vq, &slot)) { + virtio_enqueue_abort(vsc, vq, slot); + goto out; + } + if (virtio_enqueue_reserve(vsc, vq, slot, 1)) { + goto out; + } + virtio_enqueue(vsc, vq, slot, sc->sc_dmamap, 0); + virtio_enqueue_commit(vsc, vq, slot, 1); + sc->sc_active = true; +out: + mutex_exit(&sc->sc_mutex); +} + +int +viornd_match(device_t parent, cfdata_t match, void *aux) +{ + struct virtio_softc *va = aux; + if (va->sc_childdevid == PCI_PRODUCT_VIRTIO_ENTROPY) + return 1; + return 0; +} + +void +viornd_attach( device_t parent, device_t self, void *aux) +{ + struct viornd_softc *sc = device_private(self); + struct virtio_softc *vsc = device_private(parent); + bus_dma_segment_t segs[1]; + int nsegs; + int error; + + vsc->sc_vqs = &sc->sc_vq; + vsc->sc_nvqs = 1; + vsc->sc_config_change = 0; + if (vsc->sc_child != NULL) + panic("already attached to something else"); + vsc->sc_child = self; + vsc->sc_ipl = IPL_NET; + vsc->sc_intrhand = virtio_vq_intr; + sc->sc_virtio = vsc; + sc->sc_dev = self; + + (void)virtio_negotiate_features(vsc, 0); + + mutex_init(&sc->sc_mutex, MUTEX_DEFAULT, IPL_VM); + + error = bus_dmamem_alloc(vsc->sc_dmat, + VIRTIO_PAGE_SIZE, 0, 0, segs, 1, &nsegs, + BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW); + if (error) { + aprint_error_dev(sc->sc_dev, "can't alloc dmamem: %d\n", + error); + goto alloc_failed; + } + + error = bus_dmamem_map(vsc->sc_dmat, segs, nsegs, VIORND_BUFSIZE, + &sc->sc_buf, BUS_DMA_NOWAIT); + if (error) { + aprint_error_dev(sc->sc_dev, "can't map dmamem: %d\n", error); + goto map_failed; + } + + error = bus_dmamap_create(vsc->sc_dmat, VIORND_BUFSIZE, 1, + VIORND_BUFSIZE, 0, + BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW, + &sc->sc_dmamap); + if (error) { + aprint_error_dev(sc->sc_dev, "can't alloc dmamap: %d\n", + error); + goto create_failed; + } + + error = bus_dmamap_load(vsc->sc_dmat, sc->sc_dmamap, + sc->sc_buf, VIORND_BUFSIZE, NULL, + BUS_DMA_NOWAIT|BUS_DMA_READ); + if (error) { + aprint_error_dev(sc->sc_dev, "can't load dmamap: %d\n", + error); + goto load_failed; + } + + error = virtio_alloc_vq(vsc, &sc->sc_vq, 0, VIORND_BUFSIZE, 1, + "Entropy request"); + if (error) { + aprint_error_dev(sc->sc_dev, "can't alloc virtqueue: %d\n", + error); + goto vio_failed; + } + + sc->sc_vq.vq_done = viornd_vq_done; + virtio_start_vq_intr(vsc, &sc->sc_vq); + rndsource_setcb(&sc->sc_rndsource, viornd_get, sc); + rnd_attach_source(&sc->sc_rndsource, device_xname(sc->sc_dev), + RND_TYPE_RNG, + RND_FLAG_COLLECT_VALUE|RND_FLAG_HASCB); + viornd_get(VIORND_BUFSIZE, sc); + return; +vio_failed: +load_failed: + bus_dmamap_destroy(vsc->sc_dmat, sc->sc_dmamap); +create_failed: + bus_dmamem_unmap(vsc->sc_dmat, sc->sc_buf, VIORND_BUFSIZE); +map_failed: + bus_dmamem_free(vsc->sc_dmat, segs, nsegs); +alloc_failed: + vsc->sc_child = (void *)1; /* XXX bare constant 1 */ + return; +} + +int +viornd_vq_done(struct virtqueue *vq) +{ + struct virtio_softc *vsc = vq->vq_owner; + struct viornd_softc *sc = device_private(vsc->sc_child); + int slot, len; + + mutex_enter(&sc->sc_mutex); + + if (virtio_dequeue(vsc, vq, &slot, &len) != 0) { + mutex_exit(&sc->sc_mutex); + return 0; + } + + sc->sc_active = false; + + bus_dmamap_sync(vsc->sc_dmat, sc->sc_dmamap, 0, VIORND_BUFSIZE, + BUS_DMASYNC_POSTREAD); + if (len > VIORND_BUFSIZE) { + aprint_error_dev(sc->sc_dev, + "inconsistent descriptor length %d > %d\n", + len, VIORND_BUFSIZE); + goto out; + } + +#if VIORND_DEBUG + aprint_normal("%s: got %d bytes of entropy\n", __func__, len); +#endif + rnd_add_data(&sc->sc_rndsource, sc->sc_buf, VIORND_BUFSIZE, + VIORND_BUFSIZE * NBBY); +out: + virtio_dequeue_commit(vsc, vq, slot); + mutex_exit(&sc->sc_mutex); + + return 1; +}