18a272653SPeter Holm#!/bin/sh 28a272653SPeter Holm 38a272653SPeter Holm# 48a272653SPeter Holm# Copyright (c) 2008 Peter Holm <pho@FreeBSD.org> 58a272653SPeter Holm# All rights reserved. 68a272653SPeter Holm# 78a272653SPeter Holm# Redistribution and use in source and binary forms, with or without 88a272653SPeter Holm# modification, are permitted provided that the following conditions 98a272653SPeter Holm# are met: 108a272653SPeter Holm# 1. Redistributions of source code must retain the above copyright 118a272653SPeter Holm# notice, this list of conditions and the following disclaimer. 128a272653SPeter Holm# 2. Redistributions in binary form must reproduce the above copyright 138a272653SPeter Holm# notice, this list of conditions and the following disclaimer in the 148a272653SPeter Holm# documentation and/or other materials provided with the distribution. 158a272653SPeter Holm# 168a272653SPeter Holm# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 178a272653SPeter Holm# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 188a272653SPeter Holm# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 198a272653SPeter Holm# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 208a272653SPeter Holm# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 218a272653SPeter Holm# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 228a272653SPeter Holm# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 238a272653SPeter Holm# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 248a272653SPeter Holm# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 258a272653SPeter Holm# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 268a272653SPeter Holm# SUCH DAMAGE. 278a272653SPeter Holm# 288a272653SPeter Holm 298a272653SPeter Holm# Test scenario by kib@freebsd.org 308a272653SPeter Holm 318a272653SPeter Holm# Test of patch for Giant trick in cdevsw 328a272653SPeter Holm 338a272653SPeter Holm[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 348a272653SPeter Holm[ -d /usr/src/sys ] || exit 0 358a272653SPeter Holmbuilddir=`sysctl kern.version | grep @ | sed 's/.*://'` 368a272653SPeter Holm[ -d "$builddir" ] && export KERNBUILDDIR=$builddir || exit 0 378a272653SPeter Holmexport SYSDIR=`echo $builddir | sed 's#/sys.*#/sys#'` 388a272653SPeter Holmkldstat -v | grep -q pty || { kldload pty || exit 0; } 398a272653SPeter Holm 408a272653SPeter Holm. ../default.cfg 418a272653SPeter Holm 428a272653SPeter Holmodir=`pwd` 438a272653SPeter Holmdir=$RUNDIR/fpclone 448a272653SPeter Holm[ ! -d $dir ] && mkdir -p $dir 458a272653SPeter Holm 468a272653SPeter Holmcd $dir 478a272653SPeter Holmcat > Makefile <<EOF 488a272653SPeter HolmKMOD= fpclone 498a272653SPeter HolmSRCS= fpclone.c 508a272653SPeter Holm 518a272653SPeter Holm.include <bsd.kmod.mk> 528a272653SPeter HolmEOF 538a272653SPeter Holm 548a272653SPeter Holmsed '1,/^EOF2/d' < $odir/$0 > fpclone.c 558a272653SPeter Holmmake 568a272653SPeter Holmkldload $dir/fpclone.ko 578a272653SPeter Holm 588a272653SPeter Holmcd $odir 598a272653SPeter Holmfor i in `jot 10`; do 608a272653SPeter Holm dd if=/dev/fpclone bs=1m count=10 > /dev/null 2>&1 & 618a272653SPeter Holmdone 628a272653SPeter Holm 638a272653SPeter Holmexport runRUNTIME=2m 648a272653SPeter Holmcd ..; ./run.sh pty.cfg 658a272653SPeter Holm 668a272653SPeter Holmfor i in `jot 10`; do 678a272653SPeter Holm wait 688a272653SPeter Holmdone 698a272653SPeter Holmkldstat 708a272653SPeter Holmdd if=/dev/fpclone bs=1m count=1k > /dev/null 2>&1 & 718a272653SPeter Holmkldunload $dir/fpclone.ko 728a272653SPeter Holmrm -rf $dir 738a272653SPeter Holmexit 748a272653SPeter Holm 758a272653SPeter HolmEOF2 768a272653SPeter Holm#include <sys/param.h> 778a272653SPeter Holm#include <sys/systm.h> 788a272653SPeter Holm#include <sys/kernel.h> 798a272653SPeter Holm#include <sys/module.h> 808a272653SPeter Holm#include <sys/mutex.h> 818a272653SPeter Holm#include <sys/conf.h> 828a272653SPeter Holm#include <sys/uio.h> 838a272653SPeter Holm#include <sys/malloc.h> 848a272653SPeter Holm 858a272653SPeter Holmstatic d_open_t fpclone_open; 868a272653SPeter Holmstatic d_close_t fpclone_close; 878a272653SPeter Holmstatic d_read_t fpclone_read; 888a272653SPeter Holm 898a272653SPeter Holmstatic struct cdevsw fpclone_cdevsw = { 908a272653SPeter Holm .d_open = fpclone_open, 918a272653SPeter Holm .d_close = fpclone_close, 928a272653SPeter Holm .d_read = fpclone_read, 938a272653SPeter Holm .d_name = "fpclone", 948a272653SPeter Holm .d_version = D_VERSION, 958a272653SPeter Holm .d_flags = D_TRACKCLOSE 968a272653SPeter Holm}; 978a272653SPeter Holm 988a272653SPeter HolmMALLOC_DEFINE(M_FPCLONESC, "fpclone memory", "fpclone memory"); 998a272653SPeter Holm 1008a272653SPeter Holmstruct fpclone_sc 1018a272653SPeter Holm{ 1028a272653SPeter Holm int pos; 1038a272653SPeter Holm}; 1048a272653SPeter Holm 1058a272653SPeter Holmstatic struct cdev *fpclone_dev; 1068a272653SPeter Holmstatic struct mtx me; 1078a272653SPeter Holm 1088a272653SPeter Holmstatic void 1098a272653SPeter Holmfpclone_cdevpriv_dtr(void *data) 1108a272653SPeter Holm{ 1118a272653SPeter Holm free(data, M_FPCLONESC); 1128a272653SPeter Holm} 1138a272653SPeter Holm 1148a272653SPeter Holmstatic int 1158a272653SPeter Holmfpclone_open(struct cdev *dev, int oflags, int devtype, struct thread *td) 1168a272653SPeter Holm{ 1178a272653SPeter Holm struct fpclone_sc *sc; 1188a272653SPeter Holm int error; 1198a272653SPeter Holm 1208a272653SPeter Holm sc = malloc(sizeof(struct fpclone_sc), M_FPCLONESC, 1218a272653SPeter Holm M_WAITOK | M_ZERO); 1228a272653SPeter Holm error = devfs_set_cdevpriv(sc, fpclone_cdevpriv_dtr); 1238a272653SPeter Holm if (error) 1248a272653SPeter Holm fpclone_cdevpriv_dtr(sc); 1258a272653SPeter Holm return (error); 1268a272653SPeter Holm} 1278a272653SPeter Holm 1288a272653SPeter Holmstatic int 1298a272653SPeter Holmfpclone_close(struct cdev *dev, int fflag, int devtype, struct thread *td) 1308a272653SPeter Holm{ 1318a272653SPeter Holm 1328a272653SPeter Holm devfs_clear_cdevpriv(); 1338a272653SPeter Holm return (0); 1348a272653SPeter Holm} 1358a272653SPeter Holm 1368a272653SPeter Holmstatic char rdata[] = "fpclone sample data string\n"; 1378a272653SPeter Holm 1388a272653SPeter Holmstatic int 1398a272653SPeter Holmfpclone_read(struct cdev *dev, struct uio *uio, int ioflag) 1408a272653SPeter Holm{ 1418a272653SPeter Holm struct fpclone_sc *sc; 1428a272653SPeter Holm int rv, amnt, svpos, error; 1438a272653SPeter Holm 1448a272653SPeter Holm error = devfs_get_cdevpriv((void **)&sc); 1458a272653SPeter Holm if (error) 1468a272653SPeter Holm return (error); 1478a272653SPeter Holm 1488a272653SPeter Holm rv = 0; 1498a272653SPeter Holm while (uio->uio_resid > 0) { 1508a272653SPeter Holm svpos = sc->pos; 1518a272653SPeter Holm amnt = MIN(uio->uio_resid, sizeof(rdata) - svpos); 1528a272653SPeter Holm rv = uiomove(rdata + svpos, amnt, uio); 1538a272653SPeter Holm if (rv != 0) 1548a272653SPeter Holm break; 1558a272653SPeter Holm mtx_lock(&me); 1568a272653SPeter Holm sc->pos += amnt; 1578a272653SPeter Holm sc->pos %= sizeof(rdata); 1588a272653SPeter Holm mtx_unlock(&me); 1598a272653SPeter Holm } 1608a272653SPeter Holm return (rv); 1618a272653SPeter Holm} 1628a272653SPeter Holm 1638a272653SPeter Holmstatic int 1648a272653SPeter Holmfpclone_modevent(module_t mod, int what, void *arg) 1658a272653SPeter Holm{ 1668a272653SPeter Holm switch (what) { 1678a272653SPeter Holm case MOD_LOAD: 1688a272653SPeter Holm mtx_init(&me, "fp_ref", NULL, MTX_DEF); 1698a272653SPeter Holm fpclone_dev = make_dev(&fpclone_cdevsw, 0, 0, 0, 0666, 1708a272653SPeter Holm "fpclone"); 1718a272653SPeter Holm return(0); 1728a272653SPeter Holm 1738a272653SPeter Holm case MOD_UNLOAD: 1748a272653SPeter Holm destroy_dev(fpclone_dev); 1758a272653SPeter Holm mtx_destroy(&me); 1768a272653SPeter Holm return (0); 1778a272653SPeter Holm 1788a272653SPeter Holm default: 1798a272653SPeter Holm break; 1808a272653SPeter Holm } 1818a272653SPeter Holm 1828a272653SPeter Holm return (0); 1838a272653SPeter Holm} 1848a272653SPeter Holm 1858a272653SPeter Holmmoduledata_t fpclone_mdata = { 1868a272653SPeter Holm "fpclone", 1878a272653SPeter Holm fpclone_modevent, 1888a272653SPeter Holm NULL 1898a272653SPeter Holm}; 1908a272653SPeter Holm 1918a272653SPeter HolmDECLARE_MODULE(fpclone, fpclone_mdata, SI_SUB_DRIVERS, SI_ORDER_MIDDLE); 1928a272653SPeter HolmMODULE_VERSION(fpclone, 1); 193