Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 22 Sep 2008 21:05:02 GMT
From:      Warner Losh <imp@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 150310 for review
Message-ID:  <200809222105.m8ML522U005880@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=150310

Change 150310 by imp@imp_paco-paco on 2008/09/22 21:04:45

	IFC @150307

Affected files ...

.. //depot/projects/mips2/src/sys/compat/linux/linux_misc.c#13 integrate
.. //depot/projects/mips2/src/sys/dev/bge/if_bge.c#14 integrate
.. //depot/projects/mips2/src/sys/kern/tty.c#13 integrate
.. //depot/projects/mips2/src/sys/kern/tty_ttydisc.c#4 integrate
.. //depot/projects/mips2/src/sys/netgraph/netgraph.h#10 integrate
.. //depot/projects/mips2/src/sys/netgraph/ng_base.c#19 integrate
.. //depot/projects/mips2/src/sys/sys/tty.h#6 integrate
.. //depot/projects/mips2/src/sys/sys/ttydevsw.h#3 integrate
.. //depot/projects/mips2/src/sys/sys/ttydisc.h#3 integrate
.. //depot/projects/mips2/src/sys/sys/ttyhook.h#1 branch
.. //depot/projects/mips2/src/sys/sys/ttyqueue.h#2 integrate
.. //depot/projects/mips2/src/sys/ufs/ufs/ufs_dirhash.c#4 integrate
.. //depot/projects/mips2/src/tools/tools/nanobsd/nanobsd.sh#13 integrate
.. //depot/projects/mips2/src/usr.sbin/pstat/pstat.8#4 integrate
.. //depot/projects/mips2/src/usr.sbin/pstat/pstat.c#6 integrate

Differences ...

==== //depot/projects/mips2/src/sys/compat/linux/linux_misc.c#13 (text+ko) ====

@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/linux/linux_misc.c,v 1.226 2008/09/11 15:28:28 rdivacky Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/linux/linux_misc.c,v 1.227 2008/09/22 18:59:24 trasz Exp $");
 
 #include "opt_compat.h"
 #include "opt_mac.h"
@@ -306,7 +306,7 @@
 	 * than vn_open().
 	 */
 #ifdef MAC
-	error = mac_vnode_check_open(td->td_ucred, vp, FREAD);
+	error = mac_vnode_check_open(td->td_ucred, vp, VREAD);
 	if (error)
 		goto cleanup;
 #endif

==== //depot/projects/mips2/src/sys/dev/bge/if_bge.c#14 (text+ko) ====

@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/bge/if_bge.c,v 1.212 2008/09/08 18:10:15 oleg Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/bge/if_bge.c,v 1.213 2008/09/22 20:55:19 marius Exp $");
 
 /*
  * Broadcom BCM570x family gigabit ethernet driver for FreeBSD.
@@ -134,7 +134,7 @@
  * ID burned into it, though it will always be overriden by the vendor
  * ID in the EEPROM. Just to be safe, we cover all possibilities.
  */
-static struct bge_type {
+static const struct bge_type {
 	uint16_t	bge_vid;
 	uint16_t	bge_did;
 } bge_devs[] = {
@@ -1851,7 +1851,7 @@
 static int
 bge_probe(device_t dev)
 {
-	struct bge_type *t = bge_devs;
+	const struct bge_type *t = bge_devs;
 	struct bge_softc *sc = device_get_softc(dev);
 	uint16_t vid, did;
 
@@ -1873,7 +1873,8 @@
 #if __FreeBSD_version > 700024
 				const char *pname;
 
-				if (pci_get_vpd_ident(dev, &pname) == 0)
+				if (bge_has_eaddr(sc) &&
+				    pci_get_vpd_ident(dev, &pname) == 0)
 					snprintf(model, 64, "%s", pname);
 				else
 #endif

==== //depot/projects/mips2/src/sys/kern/tty.c#13 (text+ko) ====

@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/tty.c,v 1.289 2008/09/16 14:57:23 ed Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/tty.c,v 1.290 2008/09/22 19:25:14 ed Exp $");
 
 #include "opt_compat.h"
 
@@ -36,6 +36,7 @@
 #include <sys/conf.h>
 #include <sys/cons.h>
 #include <sys/fcntl.h>
+#include <sys/file.h>
 #include <sys/filio.h>
 #ifdef COMPAT_43TTY
 #include <sys/ioctl_compat.h>
@@ -59,6 +60,7 @@
 #include <sys/ttydefaults.h>
 #undef TTYDEFCHARS
 #include <sys/ucred.h>
+#include <sys/vnode.h>
 
 #include <machine/stdarg.h>
 
@@ -855,7 +857,7 @@
 
 	tp = malloc(sizeof(struct tty), M_TTY, M_WAITOK|M_ZERO);
 	tp->t_devsw = tsw;
-	tp->t_softc = sc;
+	tp->t_devswsoftc = sc;
 	tp->t_flags = tsw->tsw_flags;
 
 	tty_init_termios(tp);
@@ -923,7 +925,7 @@
 	tty_lock_assert(tp, MA_OWNED);
 
 	if (tp->t_sessioncnt != 0 ||
-	    (tp->t_flags & (TF_GONE|TF_OPENED)) != TF_GONE) {
+	    (tp->t_flags & (TF_GONE|TF_OPENED|TF_HOOK)) != TF_GONE) {
 		/* TTY is still in use. */
 		tty_unlock(tp);
 		return;
@@ -1653,6 +1655,89 @@
 		ttydevsw_inwakeup(tp);
 }
 
+static int
+ttyhook_defrint(struct tty *tp, char c, int flags)
+{
+
+	if (ttyhook_rint_bypass(tp, &c, 1) != 1)
+		return (-1);
+	
+	return (0);
+}
+
+int
+ttyhook_register(struct tty **rtp, struct thread *td, int fd,
+    struct ttyhook *th, void *softc)
+{
+	struct tty *tp;
+	struct file *fp;
+	struct cdev *dev;
+	struct cdevsw *cdp;
+	int error;
+
+	/* Validate the file descriptor. */
+	if (fget(td, fd, &fp) != 0)
+		return (EINVAL);
+	
+	/* Make sure the vnode is bound to a character device. */
+	error = EINVAL;
+	if (fp->f_type != DTYPE_VNODE || fp->f_vnode->v_type != VCHR ||
+	    fp->f_vnode->v_rdev == NULL)
+		goto done1;
+	dev = fp->f_vnode->v_rdev;
+
+	/* Make sure it is a TTY. */
+	cdp = dev_refthread(dev);
+	if (cdp == NULL)
+		goto done1;
+	if ((cdp->d_flags & D_TTY) == 0)
+		goto done2;
+	tp = dev->si_drv1;
+
+	/* Try to attach the hook to the TTY. */
+	error = EBUSY;
+	tty_lock(tp);
+	MPASS((tp->t_hook == NULL) == ((tp->t_flags & TF_HOOK) == 0));
+	if (tp->t_flags & TF_HOOK)
+		goto done3;
+
+	tp->t_flags |= TF_HOOK;
+	tp->t_hook = th;
+	tp->t_hooksoftc = softc;
+	*rtp = tp;
+	error = 0;
+
+	/* Maybe we can switch into bypass mode now. */
+	ttydisc_optimize(tp);
+
+	/* Silently convert rint() calls to rint_bypass() when possible. */
+	if (!ttyhook_hashook(tp, rint) && ttyhook_hashook(tp, rint_bypass))
+		th->th_rint = ttyhook_defrint;
+
+done3:	tty_unlock(tp);
+done2:	dev_relthread(dev);
+done1:	fdrop(fp, td);
+	return (error);
+}
+
+void
+ttyhook_unregister(struct tty *tp)
+{
+
+	tty_lock_assert(tp, MA_OWNED);
+	MPASS(tp->t_flags & TF_HOOK);
+
+	/* Disconnect the hook. */
+	tp->t_flags &= ~TF_HOOK;
+	tp->t_hook = NULL;
+
+	/* Maybe we need to leave bypass mode. */
+	ttydisc_optimize(tp);
+
+	/* Maybe deallocate the TTY as well. */
+	tty_rel_free(tp);
+}
+
 #include "opt_ddb.h"
 #ifdef DDB
 #include <ddb/ddb.h>
@@ -1686,6 +1771,7 @@
 	{ TF_EXCLUDE,	'X' },
 	{ TF_BYPASS,	'l' },
 	{ TF_ZOMBIE,	'Z' },
+	{ TF_HOOK,	's' },
 
 	{ 0,	       '\0' },
 };

==== //depot/projects/mips2/src/sys/kern/tty_ttydisc.c#4 (text+ko) ====

@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/tty_ttydisc.c,v 1.4 2008/09/10 20:12:10 csjp Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/tty_ttydisc.c,v 1.6 2008/09/22 19:25:14 ed Exp $");
 
 #include <sys/param.h>
 #include <sys/fcntl.h>
@@ -79,6 +79,8 @@
 #define CTL_ALNUM(c)	(((c) >= '0' && (c) <= '9') || \
     ((c) >= 'a' && (c) <= 'z') || ((c) >= 'A' && (c) <= 'Z'))
 
+#define	TTY_STACKBUF	256
+
 void
 ttydisc_open(struct tty *tp)
 {
@@ -100,6 +102,9 @@
 		ttydevsw_inwakeup(tp);
 		ttydevsw_outwakeup(tp);
 	}
+
+	if (ttyhook_hashook(tp, close))
+		ttyhook_close(tp);
 }
 
 static int
@@ -433,7 +438,7 @@
 int
 ttydisc_write(struct tty *tp, struct uio *uio, int ioflag)
 {
-	char ob[256];
+	char ob[TTY_STACKBUF];
 	char *obstart;
 	int error = 0;
 	unsigned int oblen = 0;
@@ -557,11 +562,12 @@
 {
 	tty_lock_assert(tp, MA_OWNED);
 
-	if (!CMP_FLAG(i, ICRNL|IGNCR|IMAXBEL|INLCR|ISTRIP|IXON) &&
+	if ((!CMP_FLAG(i, ICRNL|IGNCR|IMAXBEL|INLCR|ISTRIP|IXON) &&
 	    (!CMP_FLAG(i, BRKINT) || CMP_FLAG(i, IGNBRK)) &&
 	    (!CMP_FLAG(i, PARMRK) ||
 	        CMP_FLAG(i, IGNPAR|IGNBRK) == (IGNPAR|IGNBRK)) &&
-	    !CMP_FLAG(l, ECHO|ICANON|IEXTEN|ISIG|PENDIN)) {
+	    !CMP_FLAG(l, ECHO|ICANON|IEXTEN|ISIG|PENDIN)) ||
+	    ttyhook_hashook(tp, rint_bypass)) {
 		tp->t_flags |= TF_BYPASS;
 	} else {
 		tp->t_flags &= ~TF_BYPASS;
@@ -818,6 +824,9 @@
 	tty_lock_assert(tp, MA_OWNED);
 
 	atomic_add_long(&tty_nin, 1);
+
+	if (ttyhook_hashook(tp, rint))
+		return ttyhook_rint(tp, c, flags);
 	
 	if (tp->t_flags & TF_BYPASS)
 		goto processed;
@@ -1035,7 +1044,7 @@
 }
 
 size_t
-ttydisc_rint_bypass(struct tty *tp, char *buf, size_t len)
+ttydisc_rint_bypass(struct tty *tp, const void *buf, size_t len)
 {
 	size_t ret;
 
@@ -1045,6 +1054,9 @@
 
 	atomic_add_long(&tty_nin, len);
 
+	if (ttyhook_hashook(tp, rint_bypass))
+		return ttyhook_rint_bypass(tp, buf, len);
+
 	ret = ttyinq_write(&tp->t_inq, buf, len, 0);
 	ttyinq_canonicalize(&tp->t_inq);
 
@@ -1057,12 +1069,38 @@
 
 	tty_lock_assert(tp, MA_OWNED);
 
+	if (ttyhook_hashook(tp, rint_done))
+		ttyhook_rint_done(tp);
+
 	/* Wake up readers. */
 	tty_wakeup(tp, FREAD);
 	/* Wake up driver for echo. */
 	ttydevsw_outwakeup(tp);
 }
 
+size_t
+ttydisc_rint_poll(struct tty *tp)
+{
+	size_t l;
+
+	tty_lock_assert(tp, MA_OWNED);
+
+	if (ttyhook_hashook(tp, rint_poll))
+		return ttyhook_rint_poll(tp);
+
+	/*
+	 * XXX: Still allow character input when there's no space in the
+	 * buffers, but we haven't entered the high watermark. This is
+	 * to allow backspace characters to be inserted when in
+	 * canonical mode.
+	 */
+	l = ttyinq_bytesleft(&tp->t_inq);
+	if (l == 0 && (tp->t_flags & TF_HIWAT_IN) == 0)
+		return (1);
+	
+	return (l);
+}
+
 static void
 ttydisc_wakeup_watermark(struct tty *tp)
 {
@@ -1093,9 +1131,15 @@
 	if (tp->t_flags & TF_STOPPED)
 		return (0);
 
+	if (ttyhook_hashook(tp, getc_inject))
+		return ttyhook_getc_inject(tp, buf, len);
+
 	len = ttyoutq_read(&tp->t_outq, buf, len);
+
+	if (ttyhook_hashook(tp, getc_capture))
+		ttyhook_getc_capture(tp, buf, len);
+
 	ttydisc_wakeup_watermark(tp);
-
 	atomic_add_long(&tty_nout, len);
 
 	return (len);
@@ -1104,22 +1148,63 @@
 int
 ttydisc_getc_uio(struct tty *tp, struct uio *uio)
 {
-	int error;
+	int error = 0;
 	int obytes = uio->uio_resid;
+	size_t len;
+	char buf[TTY_STACKBUF];
 
 	tty_lock_assert(tp, MA_OWNED);
 
 	if (tp->t_flags & TF_STOPPED)
 		return (0);
 
-	error = ttyoutq_read_uio(&tp->t_outq, tp, uio);
-	ttydisc_wakeup_watermark(tp);
+	/*
+	 * When a TTY hook is attached, we cannot perform unbuffered
+	 * copying to userspace. Just call ttydisc_getc() and
+	 * temporarily store data in a shadow buffer.
+	 */
+	if (ttyhook_hashook(tp, getc_capture) ||
+	    ttyhook_hashook(tp, getc_inject)) {
+		while (uio->uio_resid > 0) {
+			/* Read to shadow buffer. */
+			len = ttydisc_getc(tp, buf,
+			    MIN(uio->uio_resid, sizeof buf));
+			if (len == 0)
+				break;
+
+			/* Copy to userspace. */
+			tty_unlock(tp);
+			error = uiomove(buf, len, uio);
+			tty_lock(tp);
+			
+			if (error != 0)
+				break;
+		}
+	} else {
+		error = ttyoutq_read_uio(&tp->t_outq, tp, uio);
 
-	atomic_add_long(&tty_nout, obytes - uio->uio_resid);
+		ttydisc_wakeup_watermark(tp);
+		atomic_add_long(&tty_nout, obytes - uio->uio_resid);
+	}
 
 	return (error);
 }
 
+size_t
+ttydisc_getc_poll(struct tty *tp)
+{
+
+	tty_lock_assert(tp, MA_OWNED);
+
+	if (tp->t_flags & TF_STOPPED)
+		return (0);
+
+	if (ttyhook_hashook(tp, getc_poll))
+		return ttyhook_getc_poll(tp);
+
+	return ttyoutq_bytesused(&tp->t_outq);
+}
+
 /*
  * XXX: not really related to the TTYDISC, but we'd better put
  * tty_putchar() here, because we need to perform proper output

==== //depot/projects/mips2/src/sys/netgraph/netgraph.h#10 (text+ko) ====

@@ -37,7 +37,7 @@
  *
  * Author: Julian Elischer <julian@freebsd.org>
  *
- * $FreeBSD: src/sys/netgraph/netgraph.h,v 1.74 2008/06/24 18:49:49 gnn Exp $
+ * $FreeBSD: src/sys/netgraph/netgraph.h,v 1.75 2008/09/22 19:28:18 thompsa Exp $
  * $Whistle: netgraph.h,v 1.29 1999/11/01 07:56:13 julian Exp $
  */
 
@@ -1130,6 +1130,7 @@
 item_p	ng_package_msg_self(node_p here, hook_p hook, struct ng_mesg *msg);
 void	ng_replace_retaddr(node_p here, item_p item, ng_ID_t retaddr);
 int	ng_rmhook_self(hook_p hook);	/* if a node wants to kill a hook */
+int	ng_rmnode_flags(node_p here, int flags);
 int	ng_rmnode_self(node_p here);	/* if a node wants to suicide */
 int	ng_rmtype(struct ng_type *tp);
 int	ng_snd_item(item_p item, int queue);

==== //depot/projects/mips2/src/sys/netgraph/ng_base.c#19 (text+ko) ====

@@ -38,7 +38,7 @@
  * Authors: Julian Elischer <julian@freebsd.org>
  *          Archie Cobbs <archie@freebsd.org>
  *
- * $FreeBSD: src/sys/netgraph/ng_base.c,v 1.163 2008/09/13 09:17:02 mav Exp $
+ * $FreeBSD: src/sys/netgraph/ng_base.c,v 1.164 2008/09/22 19:28:18 thompsa Exp $
  * $Whistle: ng_base.c,v 1.39 1999/01/28 23:54:53 julian Exp $
  */
 
@@ -1507,7 +1507,7 @@
 /* Shut this node down as soon as everyone is clear of it */
 /* Should add arg "immediately" to jump the queue */
 int
-ng_rmnode_self(node_p node)
+ng_rmnode_flags(node_p node, int flags)
 {
 	int		error;
 
@@ -1517,10 +1517,16 @@
 	if (node->nd_flags & NGF_CLOSING)
 		return (0);
 
-	error = ng_send_fn(node, NULL, &ng_rmnode, NULL, 0);
+	error = ng_send_fn1(node, NULL, &ng_rmnode, NULL, 0, flags);
 	return (error);
 }
 
+int
+ng_rmnode_self(node_p node)
+{
+	return (ng_rmnode_flags(node, NG_NOFLAGS));
+}
+
 static void
 ng_rmhook_part2(node_p node, hook_p hook, void *arg1, int arg2)
 {

==== //depot/projects/mips2/src/sys/sys/tty.h#6 (text+ko) ====

@@ -26,7 +26,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/sys/tty.h,v 1.106 2008/09/04 16:30:53 ed Exp $
+ * $FreeBSD: src/sys/sys/tty.h,v 1.108 2008/09/22 19:25:14 ed Exp $
  */
 
 #ifndef _SYS_TTY_H_
@@ -80,6 +80,7 @@
 #define	TF_EXCLUDE	0x1000	/* Exclusive access. */
 #define	TF_BYPASS	0x2000	/* Optimized input path. */
 #define	TF_ZOMBIE	0x4000	/* Modem disconnect received. */
+#define	TF_HOOK		0x8000	/* TTY has hook attached. */
 	unsigned int	t_revokecnt;	/* (t) revoke() count. */
 
 	/* Buffering mechanisms. */
@@ -112,13 +113,15 @@
 	struct termios	t_termios_lock_out;	/* cua%s.lock. */
 
 	struct ttydevsw	*t_devsw;	/* (c) Driver hooks. */
+	struct ttyhook	*t_hook;	/* (t) Capture/inject hook. */
 
 	/* Process signal delivery. */
 	struct pgrp	*t_pgrp;	/* (t) Foreground process group. */
 	struct session	*t_session;	/* (t) Associated session. */
 	unsigned int	t_sessioncnt;	/* (t) Backpointing sessions. */
 
-	void		*t_softc;	/* (c) Soft config, for drivers. */
+	void		*t_devswsoftc;	/* (c) Soft config, for drivers. */
+	void		*t_hooksoftc;	/* (t) Soft config, for hooks. */
 	struct cdev	*t_dev;		/* (c) Primary character device. */
 };
 
@@ -144,55 +147,57 @@
 #ifdef _KERNEL
 
 /* Allocation and deallocation. */
-struct tty *tty_alloc(struct ttydevsw *, void *, struct mtx *);
-void	tty_rel_pgrp(struct tty *, struct pgrp *);
-void	tty_rel_sess(struct tty *, struct session *);
-void	tty_rel_gone(struct tty *);
+struct tty *tty_alloc(struct ttydevsw *tsw, void *softc, struct mtx *mtx);
+void	tty_rel_pgrp(struct tty *tp, struct pgrp *pgrp);
+void	tty_rel_sess(struct tty *tp, struct session *sess);
+void	tty_rel_gone(struct tty *tp);
 
 #define	tty_lock(tp)		mtx_lock((tp)->t_mtx)
 #define	tty_unlock(tp)		mtx_unlock((tp)->t_mtx)
 #define	tty_lock_assert(tp,ma)	mtx_assert((tp)->t_mtx, (ma))
 
 /* Device node creation. */
-void	tty_makedev(struct tty *, struct ucred *, const char *, ...)
+void	tty_makedev(struct tty *tp, struct ucred *cred, const char *fmt, ...)
     __printflike(3, 4);
 #define	tty_makealias(tp,fmt,...) \
 	make_dev_alias((tp)->t_dev, fmt, ## __VA_ARGS__)
 
 /* Signalling processes. */
-void	tty_signal_sessleader(struct tty *, int);
-void	tty_signal_pgrp(struct tty *, int);
+void	tty_signal_sessleader(struct tty *tp, int signal);
+void	tty_signal_pgrp(struct tty *tp, int signal);
 /* Waking up readers/writers. */
-int	tty_wait(struct tty *, struct cv *);
-int	tty_timedwait(struct tty *, struct cv *, int);
-void	tty_wakeup(struct tty *, int);
+int	tty_wait(struct tty *tp, struct cv *cv);
+int	tty_timedwait(struct tty *tp, struct cv *cv, int timo);
+void	tty_wakeup(struct tty *tp, int flags);
 
 /* System messages. */
-int	tty_checkoutq(struct tty *);
-int	tty_putchar(struct tty *, char);
+int	tty_checkoutq(struct tty *tp);
+int	tty_putchar(struct tty *tp, char c);
 
-int	tty_ioctl(struct tty *, u_long, void *, struct thread *);
-int	tty_ioctl_compat(struct tty *, u_long, caddr_t, struct thread *);
-void	tty_init_console(struct tty *, speed_t);
-void	tty_flush(struct tty *, int);
-void	tty_hiwat_in_block(struct tty *);
-void	tty_hiwat_in_unblock(struct tty *);
-dev_t	tty_udev(struct tty *);
+int	tty_ioctl(struct tty *tp, u_long cmd, void *data, struct thread *td);
+int	tty_ioctl_compat(struct tty *tp, u_long cmd, caddr_t data,
+    struct thread *td);
+void	tty_init_console(struct tty *tp, speed_t speed);
+void	tty_flush(struct tty *tp, int flags);
+void	tty_hiwat_in_block(struct tty *tp);
+void	tty_hiwat_in_unblock(struct tty *tp);
+dev_t	tty_udev(struct tty *tp);
 #define	tty_opened(tp)		((tp)->t_flags & TF_OPENED)
 #define	tty_gone(tp)		((tp)->t_flags & TF_GONE)
-#define	tty_softc(tp)		((tp)->t_softc)
+#define	tty_softc(tp)		((tp)->t_devswsoftc)
 #define	tty_devname(tp)		devtoname((tp)->t_dev)
 
 /* Status line printing. */
-void	tty_info(struct tty *);
+void	tty_info(struct tty *tp);
 
 /* Pseudo-terminal hooks. */
-int	pts_alloc_external(int, struct thread *, struct file *,
-    struct cdev *, const char *);
+int	pts_alloc_external(int fd, struct thread *td, struct file *fp,
+    struct cdev *dev, const char *name);
 
 /* Drivers and line disciplines also need to call these. */
+#include <sys/ttydisc.h>
 #include <sys/ttydevsw.h>
-#include <sys/ttydisc.h>
+#include <sys/ttyhook.h>
 #endif /* _KERNEL */
 
 #endif /* !_SYS_TTY_H_ */

==== //depot/projects/mips2/src/sys/sys/ttydevsw.h#3 (text+ko) ====

@@ -26,7 +26,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/sys/ttydevsw.h,v 1.2 2008/09/04 16:39:02 ed Exp $
+ * $FreeBSD: src/sys/sys/ttydevsw.h,v 1.4 2008/09/22 19:25:14 ed Exp $
  */
 
 #ifndef _SYS_TTYDEVSW_H_
@@ -40,16 +40,18 @@
  * Driver routines that are called from the line discipline to adjust
  * hardware parameters and such.
  */
-typedef int tsw_open_t(struct tty *);
-typedef void tsw_close_t(struct tty *);
-typedef void tsw_outwakeup_t(struct tty *);
-typedef void tsw_inwakeup_t(struct tty *);
-typedef int tsw_ioctl_t(struct tty *, u_long, caddr_t, struct thread *);
-typedef int tsw_param_t(struct tty *, struct termios *);
-typedef int tsw_modem_t(struct tty *, int, int);
-typedef int tsw_mmap_t(struct tty *, vm_offset_t, vm_paddr_t *, int);
-typedef void tsw_pktnotify_t(struct tty *, char);
-typedef void tsw_free_t(void *);
+typedef int tsw_open_t(struct tty *tp);
+typedef void tsw_close_t(struct tty *tp);
+typedef void tsw_outwakeup_t(struct tty *tp);
+typedef void tsw_inwakeup_t(struct tty *tp);
+typedef int tsw_ioctl_t(struct tty *tp, u_long cmd, caddr_t data,
+    struct thread *td);
+typedef int tsw_param_t(struct tty *tp, struct termios *t);
+typedef int tsw_modem_t(struct tty *tp, int sigon, int sigoff);
+typedef int tsw_mmap_t(struct tty *tp, vm_offset_t offset,
+    vm_paddr_t * paddr, int nprot);
+typedef void tsw_pktnotify_t(struct tty *tp, char event);
+typedef void tsw_free_t(void *softc);
 
 struct ttydevsw {
 	unsigned int	tsw_flags;	/* Default TTY flags. */
@@ -95,9 +97,7 @@
 	MPASS(!tty_gone(tp));
 
 	/* Prevent spurious wakeups. */
-	if (tp->t_flags & TF_STOPPED)
-		return;
-	if (ttyoutq_bytesused(&tp->t_outq) == 0)
+	if (ttydisc_getc_poll(tp) == 0)
 		return;
 
 	tp->t_devsw->tsw_outwakeup(tp);

==== //depot/projects/mips2/src/sys/sys/ttydisc.h#3 (text+ko) ====

@@ -26,7 +26,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/sys/ttydisc.h,v 1.4 2008/09/17 13:59:05 ed Exp $
+ * $FreeBSD: src/sys/sys/ttydisc.h,v 1.6 2008/09/22 19:25:14 ed Exp $
  */
 
 #ifndef _SYS_TTYDISC_H_
@@ -42,20 +42,22 @@
 struct uio;
 
 /* Top half routines. */
-void	ttydisc_open(struct tty *);
-void	ttydisc_close(struct tty *);
-int	ttydisc_read(struct tty *, struct uio *, int);
-int	ttydisc_write(struct tty *, struct uio *, int);
-void	ttydisc_optimize(struct tty *);
+void	ttydisc_open(struct tty *tp);
+void	ttydisc_close(struct tty *tp);
+int	ttydisc_read(struct tty *tp, struct uio *uio, int ioflag);
+int	ttydisc_write(struct tty *tp, struct uio *uio, int ioflag);
+void	ttydisc_optimize(struct tty *tp);
 
 /* Bottom half routines. */
-void	ttydisc_modem(struct tty *, int);
+void	ttydisc_modem(struct tty *tp, int open);
 #define ttydisc_can_bypass(tp) ((tp)->t_flags & TF_BYPASS)
-int	ttydisc_rint(struct tty *, char, int);
-size_t	ttydisc_rint_bypass(struct tty *, char *, size_t);
-void	ttydisc_rint_done(struct tty *);
-size_t	ttydisc_getc(struct tty *, void *, size_t);
-int	ttydisc_getc_uio(struct tty *, struct uio *);
+int	ttydisc_rint(struct tty *tp, char c, int flags);
+size_t	ttydisc_rint_bypass(struct tty *tp, const void *buf, size_t len);
+void	ttydisc_rint_done(struct tty *tp);
+size_t	ttydisc_rint_poll(struct tty *tp);
+size_t	ttydisc_getc(struct tty *tp, void *buf, size_t len);
+int	ttydisc_getc_uio(struct tty *tp, struct uio *uio);
+size_t	ttydisc_getc_poll(struct tty *tp);
 
 /* Error codes for ttydisc_rint(). */
 #define	TRE_FRAMING	0x01
@@ -81,36 +83,4 @@
 	return ttyoutq_bytesleft(&tp->t_outq);
 }
 
-static __inline size_t
-ttydisc_rint_poll(struct tty *tp)
-{
-	size_t l;
-
-	tty_lock_assert(tp, MA_OWNED);
-
-	/*
-	 * XXX: Still allow character input when there's no space in the
-	 * buffers, but we haven't entered the high watermark. This is
-	 * to allow backspace characters to be inserted when in
-	 * canonical mode.
-	 */
-	l = ttyinq_bytesleft(&tp->t_inq);
-	if (l == 0 && (tp->t_flags & TF_HIWAT_IN) == 0)
-		return (1);
-	
-	return (l);
-}
-
-static __inline size_t
-ttydisc_getc_poll(struct tty *tp)
-{
-
-	tty_lock_assert(tp, MA_OWNED);
-
-	if (tp->t_flags & TF_STOPPED)
-		return (0);
-
-	return ttyoutq_bytesused(&tp->t_outq);
-}
-
 #endif /* !_SYS_TTYDISC_H_ */

==== //depot/projects/mips2/src/sys/sys/ttyqueue.h#2 (text+ko) ====

@@ -26,7 +26,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/sys/ttyqueue.h,v 1.2 2008/08/30 09:18:27 ed Exp $
+ * $FreeBSD: src/sys/sys/ttyqueue.h,v 1.3 2008/09/22 18:44:09 ed Exp $
  */
 
 #ifndef _SYS_TTYQUEUE_H_
@@ -69,19 +69,22 @@
 
 #ifdef _KERNEL
 /* Input queue handling routines. */
-void	ttyinq_setsize(struct ttyinq *, struct tty *, size_t);
-void	ttyinq_free(struct ttyinq *);
-int	ttyinq_read_uio(struct ttyinq *, struct tty *, struct uio *,
-    size_t, size_t);
-size_t	ttyinq_write(struct ttyinq *, const void *, size_t, int);
-int	ttyinq_write_nofrag(struct ttyinq *, const void *, size_t, int);
-void	ttyinq_canonicalize(struct ttyinq *);
-size_t	ttyinq_findchar(struct ttyinq *, const char *, size_t, char *);
-void	ttyinq_flush(struct ttyinq *);
-int	ttyinq_peekchar(struct ttyinq *, char *, int *);
-void	ttyinq_unputchar(struct ttyinq *);
-void	ttyinq_reprintpos_set(struct ttyinq *);
-void	ttyinq_reprintpos_reset(struct ttyinq *);
+void	ttyinq_setsize(struct ttyinq *ti, struct tty *tp, size_t len);
+void	ttyinq_free(struct ttyinq *ti);
+int	ttyinq_read_uio(struct ttyinq *ti, struct tty *tp, struct uio *uio,
+    size_t readlen, size_t flushlen);
+size_t	ttyinq_write(struct ttyinq *ti, const void *buf, size_t len,
+    int quote);
+int	ttyinq_write_nofrag(struct ttyinq *ti, const void *buf, size_t len,
+    int quote);
+void	ttyinq_canonicalize(struct ttyinq *ti);
+size_t	ttyinq_findchar(struct ttyinq *ti, const char *breakc, size_t maxlen,
+    char *lastc);
+void	ttyinq_flush(struct ttyinq *ti);
+int	ttyinq_peekchar(struct ttyinq *ti, char *c, int *quote);
+void	ttyinq_unputchar(struct ttyinq *ti);
+void	ttyinq_reprintpos_set(struct ttyinq *ti);
+void	ttyinq_reprintpos_reset(struct ttyinq *ti);
 
 static __inline void
 ttyinq_init(struct ttyinq *ti)
@@ -125,20 +128,20 @@
 }
 
 /* Input buffer iteration. */
-typedef void ttyinq_line_iterator_t(void *, char, int);
-void	ttyinq_line_iterate_from_linestart(struct ttyinq *,
-    ttyinq_line_iterator_t *, void *);
-void	ttyinq_line_iterate_from_reprintpos(struct ttyinq *,
-    ttyinq_line_iterator_t *, void *);
+typedef void ttyinq_line_iterator_t(void *data, char c, int flags);
+void	ttyinq_line_iterate_from_linestart(struct ttyinq *ti,
+    ttyinq_line_iterator_t *iterator, void *data);
+void	ttyinq_line_iterate_from_reprintpos(struct ttyinq *ti,
+    ttyinq_line_iterator_t *iterator, void *data);
 
 /* Output queue handling routines. */
-void	ttyoutq_flush(struct ttyoutq *);
-void	ttyoutq_setsize(struct ttyoutq *, struct tty *, size_t);
-void	ttyoutq_free(struct ttyoutq *);
-size_t	ttyoutq_read(struct ttyoutq *, void *, size_t);
-int	ttyoutq_read_uio(struct ttyoutq *, struct tty *, struct uio *);
-size_t	ttyoutq_write(struct ttyoutq *, const void *, size_t);
-int	ttyoutq_write_nofrag(struct ttyoutq *, const void *, size_t);
+void	ttyoutq_flush(struct ttyoutq *to);
+void	ttyoutq_setsize(struct ttyoutq *to, struct tty *tp, size_t len);
+void	ttyoutq_free(struct ttyoutq *to);
+size_t	ttyoutq_read(struct ttyoutq *to, void *buf, size_t len);
+int	ttyoutq_read_uio(struct ttyoutq *to, struct tty *tp, struct uio *uio);
+size_t	ttyoutq_write(struct ttyoutq *to, const void *buf, size_t len);
+int	ttyoutq_write_nofrag(struct ttyoutq *to, const void *buf, size_t len);
 
 static __inline void
 ttyoutq_init(struct ttyoutq *to)

==== //depot/projects/mips2/src/sys/ufs/ufs/ufs_dirhash.c#4 (text+ko) ====

@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/ufs/ufs/ufs_dirhash.c,v 1.25 2008/09/16 16:23:56 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/ufs/ufs/ufs_dirhash.c,v 1.26 2008/09/22 20:53:22 jhb Exp $");
 
 #include "opt_ufs.h"
 
@@ -461,6 +461,16 @@
 	VI_UNLOCK(vp);
 
 	/*
+	 * Remove the hash from the list since we are going to free its
+	 * memory.
+	 */
+	DIRHASHLIST_LOCK();
+	if (dh->dh_onlist)
+		TAILQ_REMOVE(&ufsdirhash_list, dh, dh_list);
+	ufs_dirhashmem -= dh->dh_memreq;
+	DIRHASHLIST_UNLOCK();
+
+	/*
 	 * At this point, any waiters for the lock should hold their
 	 * own reference on the dirhash structure.  They will drop
 	 * that reference once they grab the vnode interlock and see
@@ -479,11 +489,6 @@
 		if (dh->dh_blkfree != NULL)
 			FREE(dh->dh_blkfree, M_DIRHASH);
 	}
-	DIRHASHLIST_LOCK();
-	if (dh->dh_onlist)
-		TAILQ_REMOVE(&ufsdirhash_list, dh, dh_list);
-	ufs_dirhashmem -= dh->dh_memreq;
-	DIRHASHLIST_UNLOCK();
 
 	/*
 	 * Drop the inode's reference to the data structure.

==== //depot/projects/mips2/src/tools/tools/nanobsd/nanobsd.sh#13 (text+ko) ====

@@ -24,7 +24,7 @@
 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 # SUCH DAMAGE.
 #
-# $FreeBSD: src/tools/tools/nanobsd/nanobsd.sh,v 1.39 2008/09/21 18:02:00 simon Exp $
+# $FreeBSD: src/tools/tools/nanobsd/nanobsd.sh,v 1.40 2008/09/22 20:21:39 bms Exp $
 #
 
 set -e
@@ -402,6 +402,10 @@
 			    c - $1, "sectors" > "/dev/stderr"
 			exit 2
 		}
+
+		# Force slice 1 to be marked active. This is necessary
+		# for booting the image from a USB device to work.
+		print "a 1"
 	}
 	' > ${MAKEOBJDIRPREFIX}/_.fdisk
 

==== //depot/projects/mips2/src/usr.sbin/pstat/pstat.8#4 (text+ko) ====

@@ -33,7 +33,7 @@
 .\" SUCH DAMAGE.
 .\"
 .\"     @(#)pstat.8	8.5 (Berkeley) 5/13/94
-.\" $FreeBSD: src/usr.sbin/pstat/pstat.8,v 1.51 2008/08/20 22:09:33 ed Exp $
+.\" $FreeBSD: src/usr.sbin/pstat/pstat.8,v 1.52 2008/09/22 19:25:14 ed Exp $
 .\"
 .Dd August 20, 2008
 .Dt PSTAT 8
@@ -202,6 +202,8 @@
 block mode input routine in use
 .It Z
 connection lost
+.It s
+i/o being snooped
 .El
 .Pp
 The

==== //depot/projects/mips2/src/usr.sbin/pstat/pstat.c#6 (text+ko) ====

@@ -46,7 +46,7 @@
 #endif /* not lint */
 #endif
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/usr.sbin/pstat/pstat.c,v 1.105 2008/08/20 08:31:58 ed Exp $");
+__FBSDID("$FreeBSD: src/usr.sbin/pstat/pstat.c,v 1.106 2008/09/22 19:25:14 ed Exp $");
 
 #include <sys/param.h>
 #include <sys/time.h>
@@ -312,6 +312,7 @@
 	{ TF_EXCLUDE,	'X' },
 	{ TF_BYPASS,	'l' },
 	{ TF_ZOMBIE,	'Z' },
+	{ TF_HOOK,	's' },
 
 	{ 0,	       '\0' },
 };



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