Home | History | Annotate | Line # | Download | only in kern
tty.c revision 1.220
      1 /*	$NetBSD: tty.c,v 1.220 2008/04/24 15:35:30 ad Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 2008 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  * 2. Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  * 3. All advertising materials mentioning features or use of this software
     16  *    must display the following acknowledgement:
     17  *	This product includes software developed by the NetBSD
     18  *	Foundation, Inc. and its contributors.
     19  * 4. Neither the name of The NetBSD Foundation nor the names of its
     20  *    contributors may be used to endorse or promote products derived
     21  *    from this software without specific prior written permission.
     22  *
     23  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     24  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     25  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     26  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     27  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     28  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     29  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     30  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     31  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     32  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     33  * POSSIBILITY OF SUCH DAMAGE.
     34  */
     35 
     36 /*-
     37  * Copyright (c) 1982, 1986, 1990, 1991, 1993
     38  *	The Regents of the University of California.  All rights reserved.
     39  * (c) UNIX System Laboratories, Inc.
     40  * All or some portions of this file are derived from material licensed
     41  * to the University of California by American Telephone and Telegraph
     42  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
     43  * the permission of UNIX System Laboratories, Inc.
     44  *
     45  * Redistribution and use in source and binary forms, with or without
     46  * modification, are permitted provided that the following conditions
     47  * are met:
     48  * 1. Redistributions of source code must retain the above copyright
     49  *    notice, this list of conditions and the following disclaimer.
     50  * 2. Redistributions in binary form must reproduce the above copyright
     51  *    notice, this list of conditions and the following disclaimer in the
     52  *    documentation and/or other materials provided with the distribution.
     53  * 3. Neither the name of the University nor the names of its contributors
     54  *    may be used to endorse or promote products derived from this software
     55  *    without specific prior written permission.
     56  *
     57  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     58  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     59  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     60  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     61  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     62  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     63  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     64  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     65  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     66  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     67  * SUCH DAMAGE.
     68  *
     69  *	@(#)tty.c	8.13 (Berkeley) 1/9/95
     70  */
     71 
     72 #include <sys/cdefs.h>
     73 __KERNEL_RCSID(0, "$NetBSD: tty.c,v 1.220 2008/04/24 15:35:30 ad Exp $");
     74 
     75 #include <sys/param.h>
     76 #include <sys/systm.h>
     77 #include <sys/ioctl.h>
     78 #include <sys/proc.h>
     79 #define	TTYDEFCHARS
     80 #include <sys/tty.h>
     81 #undef	TTYDEFCHARS
     82 #include <sys/file.h>
     83 #include <sys/conf.h>
     84 #include <sys/dkstat.h>
     85 #include <sys/uio.h>
     86 #include <sys/kernel.h>
     87 #include <sys/vnode.h>
     88 #include <sys/syslog.h>
     89 #include <sys/malloc.h>
     90 #include <sys/kmem.h>
     91 #include <sys/signalvar.h>
     92 #include <sys/resourcevar.h>
     93 #include <sys/poll.h>
     94 #include <sys/kprintf.h>
     95 #include <sys/namei.h>
     96 #include <sys/sysctl.h>
     97 #include <sys/kauth.h>
     98 #include <sys/intr.h>
     99 
    100 #include <machine/stdarg.h>
    101 
    102 static int	ttnread(struct tty *);
    103 static void	ttyblock(struct tty *);
    104 static void	ttyecho(int, struct tty *);
    105 static void	ttyrubo(struct tty *, int);
    106 static void	ttyprintf_nolock(struct tty *, const char *fmt, ...)
    107     __attribute__((__format__(__printf__,2,3)));
    108 static int	proc_compare(struct proc *, struct proc *);
    109 static void	ttysigintr(void *);
    110 
    111 /* Symbolic sleep message strings. */
    112 const char	ttclos[] = "ttycls";
    113 const char	ttopen[] = "ttyopn";
    114 const char	ttybg[] = "ttybg";
    115 const char	ttyin[] = "ttyin";
    116 const char	ttyout[] = "ttyout";
    117 
    118 /*
    119  * Used to determine whether we still have a connection.  This is true in
    120  * one of 3 cases:
    121  * 1) We have carrier.
    122  * 2) It's a locally attached terminal, and we are therefore ignoring carrier.
    123  * 3) We're using a flow control mechanism that overloads the carrier signal.
    124  */
    125 #define	CONNECTED(tp)	(ISSET(tp->t_state, TS_CARR_ON) ||	\
    126 			 ISSET(tp->t_cflag, CLOCAL | MDMBUF))
    127 
    128 /*
    129  * Table with character classes and parity. The 8th bit indicates parity,
    130  * the 7th bit indicates the character is an alphameric or underscore (for
    131  * ALTWERASE), and the low 6 bits indicate delay type.  If the low 6 bits
    132  * are 0 then the character needs no special processing on output; classes
    133  * other than 0 might be translated or (not currently) require delays.
    134  */
    135 #define	E	0x00	/* Even parity. */
    136 #define	O	0x80	/* Odd parity. */
    137 #define	PARITY(c)	(char_type[c] & O)
    138 
    139 #define	ALPHA	0x40	/* Alpha or underscore. */
    140 #define	ISALPHA(c)	(char_type[(c) & TTY_CHARMASK] & ALPHA)
    141 
    142 #define	CCLASSMASK	0x3f
    143 #define	CCLASS(c)	(char_type[c] & CCLASSMASK)
    144 
    145 #define	BS	BACKSPACE
    146 #define	CC	CONTROL
    147 #define	CR	RETURN
    148 #define	NA	ORDINARY | ALPHA
    149 #define	NL	NEWLINE
    150 #define	NO	ORDINARY
    151 #define	TB	TAB
    152 #define	VT	VTAB
    153 
    154 unsigned char const char_type[] = {
    155 	E|CC, O|CC, O|CC, E|CC, O|CC, E|CC, E|CC, O|CC,	/* nul - bel */
    156 	O|BS, E|TB, E|NL, O|CC, E|VT, O|CR, O|CC, E|CC,	/* bs - si */
    157 	O|CC, E|CC, E|CC, O|CC, E|CC, O|CC, O|CC, E|CC,	/* dle - etb */
    158 	E|CC, O|CC, O|CC, E|CC, O|CC, E|CC, E|CC, O|CC,	/* can - us */
    159 	O|NO, E|NO, E|NO, O|NO, E|NO, O|NO, O|NO, E|NO,	/* sp - ' */
    160 	E|NO, O|NO, O|NO, E|NO, O|NO, E|NO, E|NO, O|NO,	/* ( - / */
    161 	E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA,	/* 0 - 7 */
    162 	O|NA, E|NA, E|NO, O|NO, E|NO, O|NO, O|NO, E|NO,	/* 8 - ? */
    163 	O|NO, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA,	/* @ - G */
    164 	E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA,	/* H - O */
    165 	E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA,	/* P - W */
    166 	O|NA, E|NA, E|NA, O|NO, E|NO, O|NO, O|NO, O|NA,	/* X - _ */
    167 	E|NO, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA,	/* ` - g */
    168 	O|NA, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA,	/* h - o */
    169 	O|NA, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA,	/* p - w */
    170 	E|NA, O|NA, O|NA, E|NO, O|NO, E|NO, E|NO, O|CC,	/* x - del */
    171 	/*
    172 	 * Meta chars; should be settable per character set;
    173 	 * for now, treat them all as normal characters.
    174 	 */
    175 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    176 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    177 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    178 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    179 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    180 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    181 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    182 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    183 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    184 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    185 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    186 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    187 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    188 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    189 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    190 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    191 };
    192 #undef	BS
    193 #undef	CC
    194 #undef	CR
    195 #undef	NA
    196 #undef	NL
    197 #undef	NO
    198 #undef	TB
    199 #undef	VT
    200 
    201 static struct ttylist_head tty_sigqueue = TAILQ_HEAD_INITIALIZER(tty_sigqueue);
    202 static void *tty_sigsih;
    203 
    204 struct ttylist_head ttylist = TAILQ_HEAD_INITIALIZER(ttylist);
    205 int tty_count;
    206 kmutex_t tty_lock;
    207 
    208 uint64_t tk_cancc;
    209 uint64_t tk_nin;
    210 uint64_t tk_nout;
    211 uint64_t tk_rawcc;
    212 
    213 SYSCTL_SETUP(sysctl_kern_tkstat_setup, "sysctl kern.tkstat subtree setup")
    214 {
    215 
    216 	sysctl_createv(clog, 0, NULL, NULL,
    217 		       CTLFLAG_PERMANENT,
    218 		       CTLTYPE_NODE, "kern", NULL,
    219 		       NULL, 0, NULL, 0,
    220 		       CTL_KERN, CTL_EOL);
    221 	sysctl_createv(clog, 0, NULL, NULL,
    222 		       CTLFLAG_PERMANENT,
    223 		       CTLTYPE_NODE, "tkstat",
    224 		       SYSCTL_DESCR("Number of characters sent and and "
    225 				    "received on ttys"),
    226 		       NULL, 0, NULL, 0,
    227 		       CTL_KERN, KERN_TKSTAT, CTL_EOL);
    228 
    229 	sysctl_createv(clog, 0, NULL, NULL,
    230 		       CTLFLAG_PERMANENT,
    231 		       CTLTYPE_QUAD, "nin",
    232 		       SYSCTL_DESCR("Total number of tty input characters"),
    233 		       NULL, 0, &tk_nin, 0,
    234 		       CTL_KERN, KERN_TKSTAT, KERN_TKSTAT_NIN, CTL_EOL);
    235 	sysctl_createv(clog, 0, NULL, NULL,
    236 		       CTLFLAG_PERMANENT,
    237 		       CTLTYPE_QUAD, "nout",
    238 		       SYSCTL_DESCR("Total number of tty output characters"),
    239 		       NULL, 0, &tk_nout, 0,
    240 		       CTL_KERN, KERN_TKSTAT, KERN_TKSTAT_NOUT, CTL_EOL);
    241 	sysctl_createv(clog, 0, NULL, NULL,
    242 		       CTLFLAG_PERMANENT,
    243 		       CTLTYPE_QUAD, "cancc",
    244 		       SYSCTL_DESCR("Number of canonical tty input characters"),
    245 		       NULL, 0, &tk_cancc, 0,
    246 		       CTL_KERN, KERN_TKSTAT, KERN_TKSTAT_CANCC, CTL_EOL);
    247 	sysctl_createv(clog, 0, NULL, NULL,
    248 		       CTLFLAG_PERMANENT,
    249 		       CTLTYPE_QUAD, "rawcc",
    250 		       SYSCTL_DESCR("Number of raw tty input characters"),
    251 		       NULL, 0, &tk_rawcc, 0,
    252 		       CTL_KERN, KERN_TKSTAT, KERN_TKSTAT_RAWCC, CTL_EOL);
    253 }
    254 
    255 int
    256 ttyopen(struct tty *tp, int dialout, int nonblock)
    257 {
    258 	int	error;
    259 
    260 	error = 0;
    261 
    262 	mutex_spin_enter(&tty_lock);
    263 
    264 	if (dialout) {
    265 		/*
    266 		 * If the device is already open for non-dialout, fail.
    267 		 * Otherwise, set TS_DIALOUT to block any pending non-dialout
    268 		 * opens.
    269 		 */
    270 		if (ISSET(tp->t_state, TS_ISOPEN) &&
    271 		    !ISSET(tp->t_state, TS_DIALOUT)) {
    272 			error = EBUSY;
    273 			goto out;
    274 		}
    275 		SET(tp->t_state, TS_DIALOUT);
    276 	} else {
    277 		if (!nonblock) {
    278 			/*
    279 			 * Wait for carrier.  Also wait for any dialout
    280 			 * processes to close the tty first.
    281 			 */
    282 			while (ISSET(tp->t_state, TS_DIALOUT) ||
    283 			       !CONNECTED(tp)) {
    284 				tp->t_wopen++;
    285 				error = ttysleep(tp, &tp->t_rawq.c_cv, true, 0);
    286 				tp->t_wopen--;
    287 				if (error)
    288 					goto out;
    289 			}
    290 		} else {
    291 			/*
    292 			 * Don't allow a non-blocking non-dialout open if the
    293 			 * device is already open for dialout.
    294 			 */
    295 			if (ISSET(tp->t_state, TS_DIALOUT)) {
    296 				error = EBUSY;
    297 				goto out;
    298 			}
    299 		}
    300 	}
    301 
    302 out:
    303 	mutex_spin_exit(&tty_lock);
    304 	return (error);
    305 }
    306 
    307 /*
    308  * Initial open of tty, or (re)entry to standard tty line discipline.
    309  */
    310 int
    311 ttylopen(dev_t device, struct tty *tp)
    312 {
    313 
    314 	mutex_spin_enter(&tty_lock);
    315 	tp->t_dev = device;
    316 	if (!ISSET(tp->t_state, TS_ISOPEN)) {
    317 		SET(tp->t_state, TS_ISOPEN);
    318 		memset(&tp->t_winsize, 0, sizeof(tp->t_winsize));
    319 #ifdef COMPAT_OLDTTY
    320 		tp->t_flags = 0;
    321 #endif
    322 	}
    323 	mutex_spin_exit(&tty_lock);
    324 	return (0);
    325 }
    326 
    327 /*
    328  * Handle close() on a tty line: flush and set to initial state,
    329  * bumping generation number so that pending read/write calls
    330  * can detect recycling of the tty.
    331  */
    332 int
    333 ttyclose(struct tty *tp)
    334 {
    335 	extern struct tty *constty;	/* Temporary virtual console. */
    336 	struct session *sess;
    337 
    338 	mutex_spin_enter(&tty_lock);
    339 
    340 	if (constty == tp)
    341 		constty = NULL;
    342 
    343 	ttyflush(tp, FREAD | FWRITE);
    344 
    345 	tp->t_gen++;
    346 	tp->t_pgrp = NULL;
    347 	tp->t_state = 0;
    348 	sess = tp->t_session;
    349 	tp->t_session = NULL;
    350 
    351 	mutex_spin_exit(&tty_lock);
    352 
    353 	mutex_enter(proc_lock);
    354 	if (sess != NULL)
    355 		SESSRELE(sess);
    356 	mutex_exit(proc_lock);
    357 
    358 	return (0);
    359 }
    360 
    361 #define	FLUSHQ(q) {							\
    362 	if ((q)->c_cc)							\
    363 		ndflush(q, (q)->c_cc);					\
    364 }
    365 
    366 /*
    367  * This macro is used in canonical mode input processing, where a read
    368  * request shall not return unless a 'line delimiter' ('\n') or 'break'
    369  * (EOF, EOL, EOL2) character (or a signal) has been received. As EOL2
    370  * is an extension to the POSIX.1 defined set of special characters,
    371  * recognize it only if IEXTEN is set in the set of local flags.
    372  */
    373 #define	TTBREAKC(c, lflg)						\
    374 	((c) == '\n' || (((c) == cc[VEOF] || (c) == cc[VEOL] ||		\
    375 	((c) == cc[VEOL2] && ISSET(lflg, IEXTEN))) && (c) != _POSIX_VDISABLE))
    376 
    377 
    378 
    379 /*
    380  * ttyinput() helper.
    381  * Call with the tty lock held.
    382  */
    383 static int
    384 ttyinput_wlock(int c, struct tty *tp)
    385 {
    386 	int	iflag, lflag, i, error;
    387 	u_char	*cc;
    388 
    389 	KASSERT(mutex_owned(&tty_lock));
    390 
    391 	/*
    392 	 * If input is pending take it first.
    393 	 */
    394 	lflag = tp->t_lflag;
    395 	if (ISSET(lflag, PENDIN))
    396 		ttypend(tp);
    397 	/*
    398 	 * Gather stats.
    399 	 */
    400 	if (ISSET(lflag, ICANON)) {
    401 		++tk_cancc;
    402 		++tp->t_cancc;
    403 	} else {
    404 		++tk_rawcc;
    405 		++tp->t_rawcc;
    406 	}
    407 	++tk_nin;
    408 
    409 	cc = tp->t_cc;
    410 
    411 	/*
    412 	 * Handle exceptional conditions (break, parity, framing).
    413 	 */
    414 	iflag = tp->t_iflag;
    415 	if ((error = (ISSET(c, TTY_ERRORMASK))) != 0) {
    416 		CLR(c, TTY_ERRORMASK);
    417 		if (ISSET(error, TTY_FE) && c == 0) {		/* Break. */
    418 			if (ISSET(iflag, IGNBRK))
    419 				return (0);
    420 			else if (ISSET(iflag, BRKINT)) {
    421 				ttyflush(tp, FREAD | FWRITE);
    422 				ttysig(tp, TTYSIG_PG1, SIGINT);
    423 				return (0);
    424 			} else if (ISSET(iflag, PARMRK))
    425 				goto parmrk;
    426 		} else if ((ISSET(error, TTY_PE) && ISSET(iflag, INPCK)) ||
    427 		    ISSET(error, TTY_FE)) {
    428 			if (ISSET(iflag, IGNPAR))
    429 				return (0);
    430 			else if (ISSET(iflag, PARMRK)) {
    431  parmrk:			(void)putc(0377 | TTY_QUOTE, &tp->t_rawq);
    432 				(void)putc(0    | TTY_QUOTE, &tp->t_rawq);
    433 				(void)putc(c    | TTY_QUOTE, &tp->t_rawq);
    434 				return (0);
    435 			} else
    436 				c = 0;
    437 		}
    438 	} else if (c == 0377 &&
    439 	    ISSET(iflag, ISTRIP|IGNPAR|INPCK|PARMRK) == (INPCK|PARMRK)) {
    440 		/* "Escape" a valid character of '\377'. */
    441 		(void)putc(0377 | TTY_QUOTE, &tp->t_rawq);
    442 		(void)putc(0377 | TTY_QUOTE, &tp->t_rawq);
    443 		goto endcase;
    444 	}
    445 
    446 	/*
    447 	 * In tandem mode, check high water mark.
    448 	 */
    449 	if (ISSET(iflag, IXOFF) || ISSET(tp->t_cflag, CHWFLOW))
    450 		ttyblock(tp);
    451 	if (!ISSET(tp->t_state, TS_TYPEN) && ISSET(iflag, ISTRIP))
    452 		CLR(c, 0x80);
    453 	if (!ISSET(lflag, EXTPROC)) {
    454 		/*
    455 		 * Check for literal nexting very first
    456 		 */
    457 		if (ISSET(tp->t_state, TS_LNCH)) {
    458 			SET(c, TTY_QUOTE);
    459 			CLR(tp->t_state, TS_LNCH);
    460 		}
    461 		/*
    462 		 * Scan for special characters.  This code
    463 		 * is really just a big case statement with
    464 		 * non-constant cases.  The bottom of the
    465 		 * case statement is labeled ``endcase'', so goto
    466 		 * it after a case match, or similar.
    467 		 */
    468 
    469 		/*
    470 		 * Control chars which aren't controlled
    471 		 * by ICANON, ISIG, or IXON.
    472 		 */
    473 		if (ISSET(lflag, IEXTEN)) {
    474 			if (CCEQ(cc[VLNEXT], c)) {
    475 				if (ISSET(lflag, ECHO)) {
    476 					if (ISSET(lflag, ECHOE)) {
    477 						(void)ttyoutput('^', tp);
    478 						(void)ttyoutput('\b', tp);
    479 					} else
    480 						ttyecho(c, tp);
    481 				}
    482 				SET(tp->t_state, TS_LNCH);
    483 				goto endcase;
    484 			}
    485 			if (CCEQ(cc[VDISCARD], c)) {
    486 				if (ISSET(lflag, FLUSHO))
    487 					CLR(tp->t_lflag, FLUSHO);
    488 				else {
    489 					ttyflush(tp, FWRITE);
    490 					ttyecho(c, tp);
    491 					if (tp->t_rawq.c_cc + tp->t_canq.c_cc)
    492 						ttyretype(tp);
    493 					SET(tp->t_lflag, FLUSHO);
    494 				}
    495 				goto startoutput;
    496 			}
    497 		}
    498 		/*
    499 		 * Signals.
    500 		 */
    501 		if (ISSET(lflag, ISIG)) {
    502 			if (CCEQ(cc[VINTR], c) || CCEQ(cc[VQUIT], c)) {
    503 				if (!ISSET(lflag, NOFLSH))
    504 					ttyflush(tp, FREAD | FWRITE);
    505 				ttyecho(c, tp);
    506 				ttysig(tp, TTYSIG_PG1, CCEQ(cc[VINTR], c) ?
    507 				    SIGINT : SIGQUIT);
    508 				goto endcase;
    509 			}
    510 			if (CCEQ(cc[VSUSP], c)) {
    511 				if (!ISSET(lflag, NOFLSH))
    512 					ttyflush(tp, FREAD);
    513 				ttyecho(c, tp);
    514 				ttysig(tp, TTYSIG_PG1, SIGTSTP);
    515 				goto endcase;
    516 			}
    517 		}
    518 		/*
    519 		 * Handle start/stop characters.
    520 		 */
    521 		if (ISSET(iflag, IXON)) {
    522 			if (CCEQ(cc[VSTOP], c)) {
    523 				if (!ISSET(tp->t_state, TS_TTSTOP)) {
    524 					SET(tp->t_state, TS_TTSTOP);
    525 					cdev_stop(tp, 0);
    526 					return (0);
    527 				}
    528 				if (!CCEQ(cc[VSTART], c))
    529 					return (0);
    530 				/*
    531 				 * if VSTART == VSTOP then toggle
    532 				 */
    533 				goto endcase;
    534 			}
    535 			if (CCEQ(cc[VSTART], c))
    536 				goto restartoutput;
    537 		}
    538 		/*
    539 		 * IGNCR, ICRNL, & INLCR
    540 		 */
    541 		if (c == '\r') {
    542 			if (ISSET(iflag, IGNCR))
    543 				goto endcase;
    544 			else if (ISSET(iflag, ICRNL))
    545 				c = '\n';
    546 		} else if (c == '\n' && ISSET(iflag, INLCR))
    547 			c = '\r';
    548 	}
    549 	if (!ISSET(lflag, EXTPROC) && ISSET(lflag, ICANON)) {
    550 		/*
    551 		 * From here on down canonical mode character
    552 		 * processing takes place.
    553 		 */
    554 		/*
    555 		 * erase (^H / ^?)
    556 		 */
    557 		if (CCEQ(cc[VERASE], c)) {
    558 			if (tp->t_rawq.c_cc)
    559 				ttyrub(unputc(&tp->t_rawq), tp);
    560 			goto endcase;
    561 		}
    562 		/*
    563 		 * kill (^U)
    564 		 */
    565 		if (CCEQ(cc[VKILL], c)) {
    566 			if (ISSET(lflag, ECHOKE) &&
    567 			    tp->t_rawq.c_cc == tp->t_rocount &&
    568 			    !ISSET(lflag, ECHOPRT))
    569 				while (tp->t_rawq.c_cc)
    570 					ttyrub(unputc(&tp->t_rawq), tp);
    571 			else {
    572 				ttyecho(c, tp);
    573 				if (ISSET(lflag, ECHOK) ||
    574 				    ISSET(lflag, ECHOKE))
    575 					ttyecho('\n', tp);
    576 				FLUSHQ(&tp->t_rawq);
    577 				tp->t_rocount = 0;
    578 			}
    579 			CLR(tp->t_state, TS_LOCAL);
    580 			goto endcase;
    581 		}
    582 		/*
    583 		 * Extensions to the POSIX.1 GTI set of functions.
    584 		 */
    585 		if (ISSET(lflag, IEXTEN)) {
    586 			/*
    587 			 * word erase (^W)
    588 			 */
    589 			if (CCEQ(cc[VWERASE], c)) {
    590 				int alt = ISSET(lflag, ALTWERASE);
    591 				int ctype;
    592 
    593 				/*
    594 				 * erase whitespace
    595 				 */
    596 				while ((c = unputc(&tp->t_rawq)) == ' ' ||
    597 				    c == '\t')
    598 					ttyrub(c, tp);
    599 				if (c == -1)
    600 					goto endcase;
    601 				/*
    602 				 * erase last char of word and remember the
    603 				 * next chars type (for ALTWERASE)
    604 				 */
    605 				ttyrub(c, tp);
    606 				c = unputc(&tp->t_rawq);
    607 				if (c == -1)
    608 					goto endcase;
    609 				if (c == ' ' || c == '\t') {
    610 					(void)putc(c, &tp->t_rawq);
    611 					goto endcase;
    612 				}
    613 				ctype = ISALPHA(c);
    614 				/*
    615 				 * erase rest of word
    616 				 */
    617 				do {
    618 					ttyrub(c, tp);
    619 					c = unputc(&tp->t_rawq);
    620 					if (c == -1)
    621 						goto endcase;
    622 				} while (c != ' ' && c != '\t' &&
    623 				    (alt == 0 || ISALPHA(c) == ctype));
    624 				(void)putc(c, &tp->t_rawq);
    625 				goto endcase;
    626 			}
    627 			/*
    628 			 * reprint line (^R)
    629 			 */
    630 			if (CCEQ(cc[VREPRINT], c)) {
    631 				ttyretype(tp);
    632 				goto endcase;
    633 			}
    634 			/*
    635 			 * ^T - kernel info and generate SIGINFO
    636 			 */
    637 			if (CCEQ(cc[VSTATUS], c)) {
    638 				ttysig(tp, TTYSIG_PG1, SIGINFO);
    639 				goto endcase;
    640 			}
    641 		}
    642 	}
    643 	/*
    644 	 * Check for input buffer overflow
    645 	 */
    646 	if (tp->t_rawq.c_cc + tp->t_canq.c_cc >= TTYHOG) {
    647 		if (ISSET(iflag, IMAXBEL)) {
    648 			if (tp->t_outq.c_cc < tp->t_hiwat)
    649 				(void)ttyoutput(CTRL('g'), tp);
    650 		} else
    651 			ttyflush(tp, FREAD | FWRITE);
    652 		goto endcase;
    653 	}
    654 	/*
    655 	 * Put data char in q for user and
    656 	 * wakeup on seeing a line delimiter.
    657 	 */
    658 	if (putc(c, &tp->t_rawq) >= 0) {
    659 		if (!ISSET(lflag, ICANON)) {
    660 			ttwakeup(tp);
    661 			ttyecho(c, tp);
    662 			goto endcase;
    663 		}
    664 		if (TTBREAKC(c, lflag)) {
    665 			tp->t_rocount = 0;
    666 			catq(&tp->t_rawq, &tp->t_canq);
    667 			ttwakeup(tp);
    668 		} else if (tp->t_rocount++ == 0)
    669 			tp->t_rocol = tp->t_column;
    670 		if (ISSET(tp->t_state, TS_ERASE)) {
    671 			/*
    672 			 * end of prterase \.../
    673 			 */
    674 			CLR(tp->t_state, TS_ERASE);
    675 			(void)ttyoutput('/', tp);
    676 		}
    677 		i = tp->t_column;
    678 		ttyecho(c, tp);
    679 		if (CCEQ(cc[VEOF], c) && ISSET(lflag, ECHO)) {
    680 			/*
    681 			 * Place the cursor over the '^' of the ^D.
    682 			 */
    683 			i = min(2, tp->t_column - i);
    684 			while (i > 0) {
    685 				(void)ttyoutput('\b', tp);
    686 				i--;
    687 			}
    688 		}
    689 	}
    690  endcase:
    691 	/*
    692 	 * IXANY means allow any character to restart output.
    693 	 */
    694 	if (ISSET(tp->t_state, TS_TTSTOP) &&
    695 	    !ISSET(iflag, IXANY) && cc[VSTART] != cc[VSTOP]) {
    696 		return (0);
    697 	}
    698  restartoutput:
    699 	CLR(tp->t_lflag, FLUSHO);
    700 	CLR(tp->t_state, TS_TTSTOP);
    701  startoutput:
    702 	return (ttstart(tp));
    703 }
    704 
    705 /*
    706  * Process input of a single character received on a tty.
    707  *
    708  * XXX - this is a hack, all drivers must changed to acquire the
    709  *	 lock before calling linesw->l_rint()
    710  */
    711 int
    712 ttyinput(int c, struct tty *tp)
    713 {
    714 	int error;
    715 
    716 	/*
    717 	 * Unless the receiver is enabled, drop incoming data.
    718 	 */
    719 	if (!ISSET(tp->t_cflag, CREAD))
    720 		return (0);
    721 
    722 	mutex_spin_enter(&tty_lock);
    723 	error = ttyinput_wlock(c, tp);
    724 	mutex_spin_exit(&tty_lock);
    725 
    726 	return (error);
    727 }
    728 
    729 /*
    730  * Output a single character on a tty, doing output processing
    731  * as needed (expanding tabs, newline processing, etc.).
    732  * Returns < 0 if succeeds, otherwise returns char to resend.
    733  * Must be recursive.
    734  *
    735  * Call with tty lock held.
    736  */
    737 int
    738 ttyoutput(int c, struct tty *tp)
    739 {
    740 	long	oflag;
    741 	int	col, notout;
    742 
    743 	KASSERT(mutex_owned(&tty_lock));
    744 
    745 	oflag = tp->t_oflag;
    746 	if (!ISSET(oflag, OPOST)) {
    747 		tk_nout++;
    748 		tp->t_outcc++;
    749 		if (!ISSET(tp->t_lflag, FLUSHO) && putc(c, &tp->t_outq))
    750 			return (c);
    751 		return (-1);
    752 	}
    753 	/*
    754 	 * Do tab expansion if OXTABS is set.  Special case if we do external
    755 	 * processing, we don't do the tab expansion because we'll probably
    756 	 * get it wrong.  If tab expansion needs to be done, let it happen
    757 	 * externally.
    758 	 */
    759 	CLR(c, ~TTY_CHARMASK);
    760 	if (c == '\t' &&
    761 	    ISSET(oflag, OXTABS) && !ISSET(tp->t_lflag, EXTPROC)) {
    762 		c = 8 - (tp->t_column & 7);
    763 		if (ISSET(tp->t_lflag, FLUSHO)) {
    764 			notout = 0;
    765 		} else {
    766 			notout = b_to_q("        ", c, &tp->t_outq);
    767 			c -= notout;
    768 			tk_nout += c;
    769 			tp->t_outcc += c;
    770 		}
    771 		tp->t_column += c;
    772 		return (notout ? '\t' : -1);
    773 	}
    774 	if (c == CEOT && ISSET(oflag, ONOEOT))
    775 		return (-1);
    776 
    777 	/*
    778 	 * Newline translation: if ONLCR is set,
    779 	 * translate newline into "\r\n".
    780 	 */
    781 	if (c == '\n' && ISSET(tp->t_oflag, ONLCR)) {
    782 		tk_nout++;
    783 		tp->t_outcc++;
    784 		if (!ISSET(tp->t_lflag, FLUSHO) && putc('\r', &tp->t_outq))
    785 			return (c);
    786 	}
    787 	/* If OCRNL is set, translate "\r" into "\n". */
    788 	else if (c == '\r' && ISSET(tp->t_oflag, OCRNL))
    789 		c = '\n';
    790 	/* If ONOCR is set, don't transmit CRs when on column 0. */
    791 	else if (c == '\r' && ISSET(tp->t_oflag, ONOCR) && tp->t_column == 0)
    792 		return (-1);
    793 
    794 	tk_nout++;
    795 	tp->t_outcc++;
    796 	if (!ISSET(tp->t_lflag, FLUSHO) && putc(c, &tp->t_outq))
    797 		return (c);
    798 
    799 	col = tp->t_column;
    800 	switch (CCLASS(c)) {
    801 	case BACKSPACE:
    802 		if (col > 0)
    803 			--col;
    804 		break;
    805 	case CONTROL:
    806 		break;
    807 	case NEWLINE:
    808 		if (ISSET(tp->t_oflag, ONLCR | ONLRET))
    809 			col = 0;
    810 		break;
    811 	case RETURN:
    812 		col = 0;
    813 		break;
    814 	case ORDINARY:
    815 		++col;
    816 		break;
    817 	case TAB:
    818 		col = (col + 8) & ~7;
    819 		break;
    820 	}
    821 	tp->t_column = col;
    822 	return (-1);
    823 }
    824 
    825 /*
    826  * Ioctls for all tty devices.  Called after line-discipline specific ioctl
    827  * has been called to do discipline-specific functions and/or reject any
    828  * of these ioctl commands.
    829  */
    830 /* ARGSUSED */
    831 int
    832 ttioctl(struct tty *tp, u_long cmd, void *data, int flag, struct lwp *l)
    833 {
    834 	extern struct tty *constty;	/* Temporary virtual console. */
    835 	struct proc *p = l ? l->l_proc : NULL;
    836 	struct linesw	*lp;
    837 	int		s, error;
    838 	struct nameidata nd;
    839 	char		infobuf[200];
    840 
    841 	/* If the ioctl involves modification, hang if in the background. */
    842 	switch (cmd) {
    843 	case  TIOCFLUSH:
    844 	case  TIOCDRAIN:
    845 	case  TIOCSBRK:
    846 	case  TIOCCBRK:
    847 	case  TIOCSTART:
    848 	case  TIOCSETA:
    849 	case  TIOCSETD:
    850 	case  TIOCSLINED:
    851 	case  TIOCSETAF:
    852 	case  TIOCSETAW:
    853 #ifdef notdef
    854 	case  TIOCSPGRP:
    855 	case  FIOSETOWN:
    856 #endif
    857 	case  TIOCSTAT:
    858 	case  TIOCSTI:
    859 	case  TIOCSWINSZ:
    860 #ifdef COMPAT_OLDTTY
    861 	case  TIOCLBIC:
    862 	case  TIOCLBIS:
    863 	case  TIOCLSET:
    864 	case  TIOCSETC:
    865 	case OTIOCSETD:
    866 	case  TIOCSETN:
    867 	case  TIOCSETP:
    868 	case  TIOCSLTC:
    869 #endif
    870 		mutex_spin_enter(&tty_lock);
    871 		while (isbackground(curproc, tp) &&
    872 		    p->p_pgrp->pg_jobc && (p->p_sflag & PS_PPWAIT) == 0 &&
    873 		    !sigismasked(l, SIGTTOU)) {
    874 			mutex_spin_exit(&tty_lock);
    875 
    876 			mutex_enter(proc_lock);
    877 			pgsignal(p->p_pgrp, SIGTTOU, 1);
    878 			mutex_exit(proc_lock);
    879 
    880 			mutex_spin_enter(&tty_lock);
    881 			error = ttysleep(tp, &lbolt, true, 0);
    882 			if (error) {
    883 				mutex_spin_exit(&tty_lock);
    884 				return (error);
    885 			}
    886 		}
    887 		mutex_spin_exit(&tty_lock);
    888 		break;
    889 	}
    890 
    891 	switch (cmd) {			/* Process the ioctl. */
    892 	case FIOASYNC:			/* set/clear async i/o */
    893 		mutex_spin_enter(&tty_lock);
    894 		if (*(int *)data)
    895 			SET(tp->t_state, TS_ASYNC);
    896 		else
    897 			CLR(tp->t_state, TS_ASYNC);
    898 		mutex_spin_exit(&tty_lock);
    899 		break;
    900 	case FIONBIO:			/* set/clear non-blocking i/o */
    901 		break;			/* XXX: delete. */
    902 	case FIONREAD:			/* get # bytes to read */
    903 		mutex_spin_enter(&tty_lock);
    904 		*(int *)data = ttnread(tp);
    905 		mutex_spin_exit(&tty_lock);
    906 		break;
    907 	case FIONWRITE:			/* get # bytes to written & unsent */
    908 		mutex_spin_enter(&tty_lock);
    909 		*(int *)data = tp->t_outq.c_cc;
    910 		mutex_spin_exit(&tty_lock);
    911 		break;
    912 	case FIONSPACE:			/* get # bytes to written & unsent */
    913 		mutex_spin_enter(&tty_lock);
    914 		*(int *)data = tp->t_outq.c_cn - tp->t_outq.c_cc;
    915 		mutex_spin_exit(&tty_lock);
    916 		break;
    917 	case TIOCEXCL:			/* set exclusive use of tty */
    918 		mutex_spin_enter(&tty_lock);
    919 		SET(tp->t_state, TS_XCLUDE);
    920 		mutex_spin_exit(&tty_lock);
    921 		break;
    922 	case TIOCFLUSH: {		/* flush buffers */
    923 		int flags = *(int *)data;
    924 
    925 		if (flags == 0)
    926 			flags = FREAD | FWRITE;
    927 		else
    928 			flags &= FREAD | FWRITE;
    929 		mutex_spin_enter(&tty_lock);
    930 		ttyflush(tp, flags);
    931 		mutex_spin_exit(&tty_lock);
    932 		break;
    933 	}
    934 	case TIOCCONS:			/* become virtual console */
    935 		if (*(int *)data) {
    936 			if (constty && constty != tp &&
    937 			    ISSET(constty->t_state, TS_CARR_ON | TS_ISOPEN) ==
    938 			    (TS_CARR_ON | TS_ISOPEN))
    939 				return EBUSY;
    940 
    941 			NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_SYSSPACE,
    942 			    "/dev/console");
    943 			if ((error = namei(&nd)) != 0)
    944 				return error;
    945 			error = VOP_ACCESS(nd.ni_vp, VREAD, l->l_cred);
    946 			vput(nd.ni_vp);
    947 			if (error)
    948 				return error;
    949 
    950 			constty = tp;
    951 		} else if (tp == constty)
    952 			constty = NULL;
    953 		break;
    954 	case TIOCDRAIN:			/* wait till output drained */
    955 		if ((error = ttywait(tp)) != 0)
    956 			return (error);
    957 		break;
    958 	case TIOCGETA: {		/* get termios struct */
    959 		struct termios *t = (struct termios *)data;
    960 
    961 		memcpy(t, &tp->t_termios, sizeof(struct termios));
    962 		break;
    963 	}
    964 	case TIOCGETD:			/* get line discipline (old) */
    965 		*(int *)data = tp->t_linesw->l_no;
    966 		break;
    967 	case TIOCGLINED:		/* get line discipline (new) */
    968 		(void)strncpy((char *)data, tp->t_linesw->l_name,
    969 		    TTLINEDNAMELEN - 1);
    970 		break;
    971 	case TIOCGWINSZ:		/* get window size */
    972 		*(struct winsize *)data = tp->t_winsize;
    973 		break;
    974 	case FIOGETOWN:
    975 		mutex_enter(proc_lock);
    976 		if (tp->t_session != NULL && !isctty(p, tp)) {
    977 			mutex_exit(proc_lock);
    978 			return (ENOTTY);
    979 		}
    980 		*(int *)data = tp->t_pgrp ? -tp->t_pgrp->pg_id : 0;
    981 		mutex_exit(proc_lock);
    982 		break;
    983 	case TIOCGPGRP:			/* get pgrp of tty */
    984 		mutex_enter(proc_lock);
    985 		if (!isctty(p, tp)) {
    986 			mutex_exit(proc_lock);
    987 			return (ENOTTY);
    988 		}
    989 		*(int *)data = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PGID;
    990 		mutex_exit(proc_lock);
    991 		break;
    992 	case TIOCGSID:			/* get sid of tty */
    993 		mutex_enter(proc_lock);
    994 		if (!isctty(p, tp)) {
    995 			mutex_exit(proc_lock);
    996 			return (ENOTTY);
    997 		}
    998 		*(int *)data = tp->t_session->s_sid;
    999 		mutex_exit(proc_lock);
   1000 		break;
   1001 #ifdef TIOCHPCL
   1002 	case TIOCHPCL:			/* hang up on last close */
   1003 		mutex_spin_enter(&tty_lock);
   1004 		SET(tp->t_cflag, HUPCL);
   1005 		mutex_spin_exit(&tty_lock);
   1006 		break;
   1007 #endif
   1008 	case TIOCNXCL:			/* reset exclusive use of tty */
   1009 		mutex_spin_enter(&tty_lock);
   1010 		CLR(tp->t_state, TS_XCLUDE);
   1011 		mutex_spin_exit(&tty_lock);
   1012 		break;
   1013 	case TIOCOUTQ:			/* output queue size */
   1014 		*(int *)data = tp->t_outq.c_cc;
   1015 		break;
   1016 	case TIOCSETA:			/* set termios struct */
   1017 	case TIOCSETAW:			/* drain output, set */
   1018 	case TIOCSETAF: {		/* drn out, fls in, set */
   1019 		struct termios *t = (struct termios *)data;
   1020 
   1021 		if (cmd == TIOCSETAW || cmd == TIOCSETAF) {
   1022 			if ((error = ttywait(tp)) != 0)
   1023 				return (error);
   1024 
   1025 			if (cmd == TIOCSETAF) {
   1026 				mutex_spin_enter(&tty_lock);
   1027 				ttyflush(tp, FREAD);
   1028 				mutex_spin_exit(&tty_lock);
   1029 			}
   1030 		}
   1031 
   1032 		s = spltty();
   1033 		/*
   1034 		 * XXXSMP - some drivers call back on us from t_param(), so
   1035 		 *	    don't take the tty spin lock here.
   1036 		 *	    require t_param() to unlock upon callback?
   1037 		 */
   1038 		/* wanted here: mutex_spin_enter(&tty_lock); */
   1039 		if (!ISSET(t->c_cflag, CIGNORE)) {
   1040 			/*
   1041 			 * Set device hardware.
   1042 			 */
   1043 			if (tp->t_param && (error = (*tp->t_param)(tp, t))) {
   1044 				/* wanted here: mutex_spin_exit(&tty_lock); */
   1045 				splx(s);
   1046 				return (error);
   1047 			} else {
   1048 				tp->t_cflag = t->c_cflag;
   1049 				tp->t_ispeed = t->c_ispeed;
   1050 				tp->t_ospeed = t->c_ospeed;
   1051 				if (t->c_ospeed == 0)
   1052 					ttysig(tp, TTYSIG_LEADER, SIGHUP);
   1053 			}
   1054 			ttsetwater(tp);
   1055 		}
   1056 
   1057 		/* delayed lock acquiring */
   1058 		mutex_spin_enter(&tty_lock);
   1059 		if (cmd != TIOCSETAF) {
   1060 			if (ISSET(t->c_lflag, ICANON) !=
   1061 			    ISSET(tp->t_lflag, ICANON)) {
   1062 				if (ISSET(t->c_lflag, ICANON)) {
   1063 					SET(tp->t_lflag, PENDIN);
   1064 					ttwakeup(tp);
   1065 				} else {
   1066 					struct clist tq;
   1067 
   1068 					catq(&tp->t_rawq, &tp->t_canq);
   1069 					tq = tp->t_rawq;
   1070 					tp->t_rawq = tp->t_canq;
   1071 					tp->t_canq = tq;
   1072 					CLR(tp->t_lflag, PENDIN);
   1073 				}
   1074 			}
   1075 		}
   1076 		tp->t_iflag = t->c_iflag;
   1077 		tp->t_oflag = t->c_oflag;
   1078 		/*
   1079 		 * Make the EXTPROC bit read only.
   1080 		 */
   1081 		if (ISSET(tp->t_lflag, EXTPROC))
   1082 			SET(t->c_lflag, EXTPROC);
   1083 		else
   1084 			CLR(t->c_lflag, EXTPROC);
   1085 		tp->t_lflag = t->c_lflag | ISSET(tp->t_lflag, PENDIN);
   1086 		memcpy(tp->t_cc, t->c_cc, sizeof(t->c_cc));
   1087 		mutex_spin_exit(&tty_lock);
   1088 		splx(s);
   1089 		break;
   1090 	}
   1091 	case TIOCSETD:			/* set line discipline (old) */
   1092 		lp = ttyldisc_lookup_bynum(*(int *)data);
   1093 		goto setldisc;
   1094 
   1095 	case TIOCSLINED: {		/* set line discipline (new) */
   1096 		char *name = (char *)data;
   1097 		dev_t device;
   1098 
   1099 		/* Null terminate to prevent buffer overflow */
   1100 		name[TTLINEDNAMELEN - 1] = '\0';
   1101 		lp = ttyldisc_lookup(name);
   1102  setldisc:
   1103 		if (lp == NULL)
   1104 			return (ENXIO);
   1105 
   1106 		if (lp != tp->t_linesw) {
   1107 			device = tp->t_dev;
   1108 			s = spltty();
   1109 			(*tp->t_linesw->l_close)(tp, flag);
   1110 			error = (*lp->l_open)(device, tp);
   1111 			if (error) {
   1112 				(void)(*tp->t_linesw->l_open)(device, tp);
   1113 				splx(s);
   1114 				ttyldisc_release(lp);
   1115 				return (error);
   1116 			}
   1117 			ttyldisc_release(tp->t_linesw);
   1118 			tp->t_linesw = lp;
   1119 			splx(s);
   1120 		} else {
   1121 			/* Drop extra reference. */
   1122 			ttyldisc_release(lp);
   1123 		}
   1124 		break;
   1125 	}
   1126 	case TIOCSTART:			/* start output, like ^Q */
   1127 		mutex_spin_enter(&tty_lock);
   1128 		if (ISSET(tp->t_state, TS_TTSTOP) ||
   1129 		    ISSET(tp->t_lflag, FLUSHO)) {
   1130 			CLR(tp->t_lflag, FLUSHO);
   1131 			CLR(tp->t_state, TS_TTSTOP);
   1132 			ttstart(tp);
   1133 		}
   1134 		mutex_spin_exit(&tty_lock);
   1135 		break;
   1136 	case TIOCSTI:			/* simulate terminal input */
   1137 		if (kauth_authorize_device_tty(l->l_cred, KAUTH_DEVICE_TTY_STI,
   1138 		    tp) != 0) {
   1139 			if (!ISSET(flag, FREAD))
   1140 				return (EPERM);
   1141 			if (!isctty(p, tp))
   1142 				return (EACCES);
   1143 		}
   1144 		(*tp->t_linesw->l_rint)(*(u_char *)data, tp);
   1145 		break;
   1146 	case TIOCSTOP:			/* stop output, like ^S */
   1147 	{
   1148 		mutex_spin_enter(&tty_lock);
   1149 		if (!ISSET(tp->t_state, TS_TTSTOP)) {
   1150 			SET(tp->t_state, TS_TTSTOP);
   1151 			cdev_stop(tp, 0);
   1152 		}
   1153 		mutex_spin_exit(&tty_lock);
   1154 		break;
   1155 	}
   1156 	case TIOCSCTTY:			/* become controlling tty */
   1157 		mutex_enter(proc_lock);
   1158 		mutex_spin_enter(&tty_lock);
   1159 
   1160 		/* Session ctty vnode pointer set in vnode layer. */
   1161 		if (!SESS_LEADER(p) ||
   1162 		    ((p->p_session->s_ttyvp || tp->t_session) &&
   1163 		    (tp->t_session != p->p_session))) {
   1164 			mutex_spin_exit(&tty_lock);
   1165 			mutex_exit(proc_lock);
   1166 			return (EPERM);
   1167 		}
   1168 
   1169 		/*
   1170 		 * `p_session' acquires a reference.
   1171 		 * But note that if `t_session' is set at this point,
   1172 		 * it must equal `p_session', in which case the session
   1173 		 * already has the correct reference count.
   1174 		 */
   1175 		if (tp->t_session == NULL)
   1176 			SESSHOLD(p->p_session);
   1177 
   1178 		tp->t_session = p->p_session;
   1179 		tp->t_pgrp = p->p_pgrp;
   1180 		p->p_session->s_ttyp = tp;
   1181 		p->p_lflag |= PL_CONTROLT;
   1182 		mutex_spin_exit(&tty_lock);
   1183 		mutex_exit(proc_lock);
   1184 		break;
   1185 	case FIOSETOWN: {		/* set pgrp of tty */
   1186 		pid_t pgid = *(int *)data;
   1187 		struct pgrp *pgrp;
   1188 
   1189 		mutex_enter(proc_lock);
   1190 		if (tp->t_session != NULL && !isctty(p, tp)) {
   1191 			mutex_exit(proc_lock);
   1192 			return (ENOTTY);
   1193 		}
   1194 
   1195 		if (pgid < 0) {
   1196 			pgrp = pg_find(-pgid, PFIND_LOCKED | PFIND_UNLOCK_FAIL);
   1197 			if (pgrp == NULL)
   1198 				return (EINVAL);
   1199 		} else {
   1200 			struct proc *p1;
   1201 			p1 = p_find(pgid, PFIND_LOCKED | PFIND_UNLOCK_FAIL);
   1202 			if (!p1)
   1203 				return (ESRCH);
   1204 			pgrp = p1->p_pgrp;
   1205 		}
   1206 
   1207 		if (pgrp->pg_session != p->p_session) {
   1208 			mutex_exit(proc_lock);
   1209 			return (EPERM);
   1210 		}
   1211 		mutex_spin_enter(&tty_lock);
   1212 		tp->t_pgrp = pgrp;
   1213 		mutex_spin_exit(&tty_lock);
   1214 		mutex_exit(proc_lock);
   1215 		break;
   1216 	}
   1217 	case TIOCSPGRP: {		/* set pgrp of tty */
   1218 		struct pgrp *pgrp;
   1219 
   1220 		mutex_enter(proc_lock);
   1221 		if (!isctty(p, tp)) {
   1222 			mutex_exit(proc_lock);
   1223 			return (ENOTTY);
   1224 		}
   1225 		pgrp = pg_find(*(int *)data, PFIND_LOCKED | PFIND_UNLOCK_FAIL);
   1226 		if (pgrp == NULL)
   1227 			return (EINVAL);
   1228 		if (pgrp->pg_session != p->p_session) {
   1229 			mutex_exit(proc_lock);
   1230 			return (EPERM);
   1231 		}
   1232 		mutex_spin_enter(&tty_lock);
   1233 		tp->t_pgrp = pgrp;
   1234 		mutex_spin_exit(&tty_lock);
   1235 		mutex_exit(proc_lock);
   1236 		break;
   1237 	}
   1238 	case TIOCSTAT:			/* get load avg stats */
   1239 		mutex_enter(proc_lock);
   1240 		ttygetinfo(tp, 0, infobuf, sizeof(infobuf));
   1241 		mutex_exit(proc_lock);
   1242 
   1243 		mutex_spin_enter(&tty_lock);
   1244 		ttyputinfo(tp, infobuf);
   1245 		mutex_spin_exit(&tty_lock);
   1246 		break;
   1247 	case TIOCSWINSZ:		/* set window size */
   1248 		mutex_spin_enter(&tty_lock);
   1249 		if (memcmp((void *)&tp->t_winsize, data,
   1250 		    sizeof(struct winsize))) {
   1251 			tp->t_winsize = *(struct winsize *)data;
   1252 			ttysig(tp, TTYSIG_PG1, SIGWINCH);
   1253 		}
   1254 		mutex_spin_exit(&tty_lock);
   1255 		break;
   1256 	default:
   1257 #ifdef COMPAT_OLDTTY
   1258 		return (ttcompat(tp, cmd, data, flag, l));
   1259 #else
   1260 		return (EPASSTHROUGH);
   1261 #endif
   1262 	}
   1263 	return (0);
   1264 }
   1265 
   1266 int
   1267 ttpoll(struct tty *tp, int events, struct lwp *l)
   1268 {
   1269 	int	revents;
   1270 
   1271 	revents = 0;
   1272 	mutex_spin_enter(&tty_lock);
   1273 	if (events & (POLLIN | POLLRDNORM))
   1274 		if (ttnread(tp) > 0)
   1275 			revents |= events & (POLLIN | POLLRDNORM);
   1276 
   1277 	if (events & (POLLOUT | POLLWRNORM))
   1278 		if (tp->t_outq.c_cc <= tp->t_lowat)
   1279 			revents |= events & (POLLOUT | POLLWRNORM);
   1280 
   1281 	if (events & POLLHUP)
   1282 		if (!CONNECTED(tp))
   1283 			revents |= POLLHUP;
   1284 
   1285 	if (revents == 0) {
   1286 		if (events & (POLLIN | POLLHUP | POLLRDNORM))
   1287 			selrecord(l, &tp->t_rsel);
   1288 
   1289 		if (events & (POLLOUT | POLLWRNORM))
   1290 			selrecord(l, &tp->t_wsel);
   1291 	}
   1292 
   1293 	mutex_spin_exit(&tty_lock);
   1294 
   1295 	return (revents);
   1296 }
   1297 
   1298 static void
   1299 filt_ttyrdetach(struct knote *kn)
   1300 {
   1301 	struct tty	*tp;
   1302 
   1303 	tp = kn->kn_hook;
   1304 	mutex_spin_enter(&tty_lock);
   1305 	SLIST_REMOVE(&tp->t_rsel.sel_klist, kn, knote, kn_selnext);
   1306 	mutex_spin_exit(&tty_lock);
   1307 }
   1308 
   1309 static int
   1310 filt_ttyread(struct knote *kn, long hint)
   1311 {
   1312 	struct tty	*tp;
   1313 
   1314 	tp = kn->kn_hook;
   1315 	if ((hint & NOTE_SUBMIT) == 0)
   1316 		mutex_spin_enter(&tty_lock);
   1317 	kn->kn_data = ttnread(tp);
   1318 	if ((hint & NOTE_SUBMIT) == 0)
   1319 		mutex_spin_exit(&tty_lock);
   1320 	return (kn->kn_data > 0);
   1321 }
   1322 
   1323 static void
   1324 filt_ttywdetach(struct knote *kn)
   1325 {
   1326 	struct tty	*tp;
   1327 
   1328 	tp = kn->kn_hook;
   1329 	mutex_spin_enter(&tty_lock);
   1330 	SLIST_REMOVE(&tp->t_wsel.sel_klist, kn, knote, kn_selnext);
   1331 	mutex_spin_exit(&tty_lock);
   1332 }
   1333 
   1334 static int
   1335 filt_ttywrite(struct knote *kn, long hint)
   1336 {
   1337 	struct tty	*tp;
   1338 	int		canwrite;
   1339 
   1340 	tp = kn->kn_hook;
   1341 	if ((hint & NOTE_SUBMIT) == 0)
   1342 		mutex_spin_enter(&tty_lock);
   1343 	kn->kn_data = tp->t_outq.c_cn - tp->t_outq.c_cc;
   1344 	canwrite = (tp->t_outq.c_cc <= tp->t_lowat) && CONNECTED(tp);
   1345 	if ((hint & NOTE_SUBMIT) == 0)
   1346 		mutex_spin_exit(&tty_lock);
   1347 	return (canwrite);
   1348 }
   1349 
   1350 static const struct filterops ttyread_filtops =
   1351 	{ 1, NULL, filt_ttyrdetach, filt_ttyread };
   1352 static const struct filterops ttywrite_filtops =
   1353 	{ 1, NULL, filt_ttywdetach, filt_ttywrite };
   1354 
   1355 int
   1356 ttykqfilter(dev_t dev, struct knote *kn)
   1357 {
   1358 	struct tty	*tp;
   1359 	struct klist	*klist;
   1360 
   1361 	if ((tp = cdev_tty(dev)) == NULL)
   1362 		return (ENXIO);
   1363 
   1364 	switch (kn->kn_filter) {
   1365 	case EVFILT_READ:
   1366 		klist = &tp->t_rsel.sel_klist;
   1367 		kn->kn_fop = &ttyread_filtops;
   1368 		break;
   1369 	case EVFILT_WRITE:
   1370 		klist = &tp->t_wsel.sel_klist;
   1371 		kn->kn_fop = &ttywrite_filtops;
   1372 		break;
   1373 	default:
   1374 		return EINVAL;
   1375 	}
   1376 
   1377 	kn->kn_hook = tp;
   1378 
   1379 	mutex_spin_enter(&tty_lock);
   1380 	SLIST_INSERT_HEAD(klist, kn, kn_selnext);
   1381 	mutex_spin_exit(&tty_lock);
   1382 
   1383 	return (0);
   1384 }
   1385 
   1386 /*
   1387  * Find the number of chars ready to be read from this tty.
   1388  * Call with the tty lock held.
   1389  */
   1390 static int
   1391 ttnread(struct tty *tp)
   1392 {
   1393 	int	nread;
   1394 
   1395 	KASSERT(mutex_owned(&tty_lock));
   1396 
   1397 	if (ISSET(tp->t_lflag, PENDIN))
   1398 		ttypend(tp);
   1399 	nread = tp->t_canq.c_cc;
   1400 	if (!ISSET(tp->t_lflag, ICANON)) {
   1401 		nread += tp->t_rawq.c_cc;
   1402 		if (nread < tp->t_cc[VMIN] && !tp->t_cc[VTIME])
   1403 			nread = 0;
   1404 	}
   1405 	return (nread);
   1406 }
   1407 
   1408 /*
   1409  * Wait for output to drain.
   1410  */
   1411 int
   1412 ttywait(struct tty *tp)
   1413 {
   1414 	int	error;
   1415 
   1416 	error = 0;
   1417 
   1418 	mutex_spin_enter(&tty_lock);
   1419 	while ((tp->t_outq.c_cc || ISSET(tp->t_state, TS_BUSY)) &&
   1420 	    CONNECTED(tp) && tp->t_oproc) {
   1421 		(*tp->t_oproc)(tp);
   1422 		error = ttysleep(tp, &tp->t_outq.c_cv, true, 0);
   1423 		if (error)
   1424 			break;
   1425 	}
   1426 	mutex_spin_exit(&tty_lock);
   1427 
   1428 	return (error);
   1429 }
   1430 
   1431 /*
   1432  * Flush if successfully wait.
   1433  */
   1434 int
   1435 ttywflush(struct tty *tp)
   1436 {
   1437 	int	error;
   1438 
   1439 	if ((error = ttywait(tp)) == 0) {
   1440 		mutex_spin_enter(&tty_lock);
   1441 		ttyflush(tp, FREAD);
   1442 		mutex_spin_exit(&tty_lock);
   1443 	}
   1444 	return (error);
   1445 }
   1446 
   1447 /*
   1448  * Flush tty read and/or write queues, notifying anyone waiting.
   1449  * Call with the tty lock held.
   1450  */
   1451 void
   1452 ttyflush(struct tty *tp, int rw)
   1453 {
   1454 
   1455 	KASSERT(mutex_owned(&tty_lock));
   1456 
   1457 	if (rw & FREAD) {
   1458 		FLUSHQ(&tp->t_canq);
   1459 		FLUSHQ(&tp->t_rawq);
   1460 		tp->t_rocount = 0;
   1461 		tp->t_rocol = 0;
   1462 		CLR(tp->t_state, TS_LOCAL);
   1463 		ttwakeup(tp);
   1464 	}
   1465 	if (rw & FWRITE) {
   1466 		CLR(tp->t_state, TS_TTSTOP);
   1467 		cdev_stop(tp, rw);
   1468 		FLUSHQ(&tp->t_outq);
   1469 		clwakeup(&tp->t_outq);
   1470 		selnotify(&tp->t_wsel, 0, NOTE_SUBMIT);
   1471 	}
   1472 }
   1473 
   1474 /*
   1475  * Copy in the default termios characters.
   1476  */
   1477 void
   1478 ttychars(struct tty *tp)
   1479 {
   1480 
   1481 	memcpy(tp->t_cc, ttydefchars, sizeof(ttydefchars));
   1482 }
   1483 
   1484 /*
   1485  * Send stop character on input overflow.
   1486  * Call with the tty lock held.
   1487  */
   1488 static void
   1489 ttyblock(struct tty *tp)
   1490 {
   1491 	int	total;
   1492 
   1493 	KASSERT(mutex_owned(&tty_lock));
   1494 
   1495 	total = tp->t_rawq.c_cc + tp->t_canq.c_cc;
   1496 	if (tp->t_rawq.c_cc > TTYHOG) {
   1497 		ttyflush(tp, FREAD | FWRITE);
   1498 		CLR(tp->t_state, TS_TBLOCK);
   1499 	}
   1500 	/*
   1501 	 * Block further input iff: current input > threshold
   1502 	 * AND input is available to user program.
   1503 	 */
   1504 	if (total >= TTYHOG / 2 &&
   1505 	    !ISSET(tp->t_state, TS_TBLOCK) &&
   1506 	    (!ISSET(tp->t_lflag, ICANON) || tp->t_canq.c_cc > 0)) {
   1507 		if (ISSET(tp->t_iflag, IXOFF) &&
   1508 		    tp->t_cc[VSTOP] != _POSIX_VDISABLE &&
   1509 		    putc(tp->t_cc[VSTOP], &tp->t_outq) == 0) {
   1510 			SET(tp->t_state, TS_TBLOCK);
   1511 			ttstart(tp);
   1512 		}
   1513 		/* Try to block remote output via hardware flow control. */
   1514 		if (ISSET(tp->t_cflag, CHWFLOW) && tp->t_hwiflow &&
   1515 		    (*tp->t_hwiflow)(tp, 1) != 0)
   1516 			SET(tp->t_state, TS_TBLOCK);
   1517 	}
   1518 }
   1519 
   1520 /*
   1521  * Delayed line discipline output
   1522  */
   1523 void
   1524 ttrstrt(void *tp_arg)
   1525 {
   1526 	struct tty	*tp;
   1527 
   1528 #ifdef DIAGNOSTIC
   1529 	if (tp_arg == NULL)
   1530 		panic("ttrstrt");
   1531 #endif
   1532 	tp = tp_arg;
   1533 	mutex_spin_enter(&tty_lock);
   1534 
   1535 	CLR(tp->t_state, TS_TIMEOUT);
   1536 	ttstart(tp); /* XXX - Shouldn't this be tp->l_start(tp)? */
   1537 
   1538 	mutex_spin_exit(&tty_lock);
   1539 }
   1540 
   1541 /*
   1542  * start a line discipline
   1543  * Always call with tty lock held?
   1544  */
   1545 int
   1546 ttstart(struct tty *tp)
   1547 {
   1548 
   1549 	if (tp->t_oproc != NULL)	/* XXX: Kludge for pty. */
   1550 		(*tp->t_oproc)(tp);
   1551 	return (0);
   1552 }
   1553 
   1554 /*
   1555  * "close" a line discipline
   1556  */
   1557 int
   1558 ttylclose(struct tty *tp, int flag)
   1559 {
   1560 
   1561 	if (flag & FNONBLOCK) {
   1562 		mutex_spin_enter(&tty_lock);
   1563 		ttyflush(tp, FREAD | FWRITE);
   1564 		mutex_spin_exit(&tty_lock);
   1565 	} else
   1566 		ttywflush(tp);
   1567 	return (0);
   1568 }
   1569 
   1570 /*
   1571  * Handle modem control transition on a tty.
   1572  * Flag indicates new state of carrier.
   1573  * Returns 0 if the line should be turned off, otherwise 1.
   1574  */
   1575 int
   1576 ttymodem(struct tty *tp, int flag)
   1577 {
   1578 
   1579 	mutex_spin_enter(&tty_lock);
   1580 	if (flag == 0) {
   1581 		if (ISSET(tp->t_state, TS_CARR_ON)) {
   1582 			/*
   1583 			 * Lost carrier.
   1584 			 */
   1585 			CLR(tp->t_state, TS_CARR_ON);
   1586 			if (ISSET(tp->t_state, TS_ISOPEN) && !CONNECTED(tp)) {
   1587 				ttysig(tp, TTYSIG_LEADER, SIGHUP);
   1588 				ttyflush(tp, FREAD | FWRITE);
   1589 				mutex_spin_exit(&tty_lock);
   1590 				return (0);
   1591 			}
   1592 		}
   1593 	} else {
   1594 		if (!ISSET(tp->t_state, TS_CARR_ON)) {
   1595 			/*
   1596 			 * Carrier now on.
   1597 			 */
   1598 			SET(tp->t_state, TS_CARR_ON);
   1599 			ttwakeup(tp);
   1600 		}
   1601 	}
   1602 	mutex_spin_exit(&tty_lock);
   1603 
   1604 	return (1);
   1605 }
   1606 
   1607 /*
   1608  * Default modem control routine (for other line disciplines).
   1609  * Return argument flag, to turn off device on carrier drop.
   1610  */
   1611 int
   1612 nullmodem(struct tty *tp, int flag)
   1613 {
   1614 
   1615 	mutex_spin_enter(&tty_lock);
   1616 	if (flag)
   1617 		SET(tp->t_state, TS_CARR_ON);
   1618 	else {
   1619 		CLR(tp->t_state, TS_CARR_ON);
   1620 		if (!CONNECTED(tp)) {
   1621 			ttysig(tp, TTYSIG_LEADER, SIGHUP);
   1622 			mutex_spin_exit(&tty_lock);
   1623 			return (0);
   1624 		}
   1625 	}
   1626 	mutex_spin_exit(&tty_lock);
   1627 
   1628 	return (1);
   1629 }
   1630 
   1631 /*
   1632  * Reinput pending characters after state switch.
   1633  */
   1634 void
   1635 ttypend(struct tty *tp)
   1636 {
   1637 	struct clist	tq;
   1638 	int		c;
   1639 
   1640 	KASSERT(mutex_owned(&tty_lock));
   1641 
   1642 	CLR(tp->t_lflag, PENDIN);
   1643 	SET(tp->t_state, TS_TYPEN);
   1644 	tq = tp->t_rawq;
   1645 	tp->t_rawq.c_cc = 0;
   1646 	tp->t_rawq.c_cf = tp->t_rawq.c_cl = 0;
   1647 	while ((c = getc(&tq)) >= 0)
   1648 		ttyinput_wlock(c, tp);
   1649 	CLR(tp->t_state, TS_TYPEN);
   1650 }
   1651 
   1652 /*
   1653  * Process a read call on a tty device.
   1654  */
   1655 int
   1656 ttread(struct tty *tp, struct uio *uio, int flag)
   1657 {
   1658 	struct clist	*qp;
   1659 	u_char		*cc;
   1660 	struct proc	*p;
   1661 	int		c, first, error, has_stime, last_cc;
   1662 	long		lflag, slp;
   1663 	struct timeval	now, stime;
   1664 
   1665 	stime.tv_usec = 0;	/* XXX gcc */
   1666 	stime.tv_sec = 0;	/* XXX gcc */
   1667 
   1668 	cc = tp->t_cc;
   1669 	p = curproc;
   1670 	error = 0;
   1671 	has_stime = 0;
   1672 	last_cc = 0;
   1673 	slp = 0;
   1674 
   1675  loop:
   1676 	mutex_spin_enter(&tty_lock);
   1677 	lflag = tp->t_lflag;
   1678 	/*
   1679 	 * take pending input first
   1680 	 */
   1681 	if (ISSET(lflag, PENDIN))
   1682 		ttypend(tp);
   1683 
   1684 	/*
   1685 	 * Hang process if it's in the background.
   1686 	 */
   1687 	if (isbackground(p, tp)) {
   1688 		if (sigismember(&p->p_sigctx.ps_sigignore, SIGTTIN) ||
   1689 		    sigismember(&curlwp->l_sigmask, SIGTTIN) ||
   1690 		    p->p_sflag & PS_PPWAIT || p->p_pgrp->pg_jobc == 0) {
   1691 			mutex_spin_exit(&tty_lock);
   1692 			return (EIO);
   1693 		}
   1694 		mutex_spin_exit(&tty_lock);
   1695 
   1696 		mutex_enter(proc_lock);
   1697 		pgsignal(p->p_pgrp, SIGTTIN, 1);
   1698 		mutex_exit(proc_lock);
   1699 
   1700 		mutex_spin_enter(&tty_lock);
   1701 		error = ttysleep(tp, &lbolt, true, 0);
   1702 		mutex_spin_exit(&tty_lock);
   1703 		if (error)
   1704 			return (error);
   1705 		goto loop;
   1706 	}
   1707 
   1708 	if (!ISSET(lflag, ICANON)) {
   1709 		int m = cc[VMIN];
   1710 		long t = cc[VTIME];
   1711 
   1712 		qp = &tp->t_rawq;
   1713 		/*
   1714 		 * Check each of the four combinations.
   1715 		 * (m > 0 && t == 0) is the normal read case.
   1716 		 * It should be fairly efficient, so we check that and its
   1717 		 * companion case (m == 0 && t == 0) first.
   1718 		 * For the other two cases, we compute the target sleep time
   1719 		 * into slp.
   1720 		 */
   1721 		if (t == 0) {
   1722 			if (qp->c_cc < m)
   1723 				goto sleep;
   1724 			goto read;
   1725 		}
   1726 		t *= hz;		/* time in deca-ticks */
   1727 /*
   1728  * Time difference in deca-ticks, split division to avoid numeric overflow.
   1729  * Ok for hz < ~200kHz
   1730  */
   1731 #define	diff(t1, t2) (((t1).tv_sec - (t2).tv_sec) * 10 * hz + \
   1732 			 ((t1).tv_usec - (t2).tv_usec) / 100 * hz / 1000)
   1733 		if (m > 0) {
   1734 			if (qp->c_cc <= 0)
   1735 				goto sleep;
   1736 			if (qp->c_cc >= m)
   1737 				goto read;
   1738 			if (!has_stime) {
   1739 				/* first character, start timer */
   1740 				has_stime = 1;
   1741 				getmicrotime(&stime);
   1742 				slp = t;
   1743 			} else if (qp->c_cc > last_cc) {
   1744 				/* got a character, restart timer */
   1745 				getmicrotime(&stime);
   1746 				slp = t;
   1747 			} else {
   1748 				/* nothing, check expiration */
   1749 				getmicrotime(&now);
   1750 				slp = t - diff(now, stime);
   1751 			}
   1752 		} else {	/* m == 0 */
   1753 			if (qp->c_cc > 0)
   1754 				goto read;
   1755 			if (!has_stime) {
   1756 				has_stime = 1;
   1757 				getmicrotime(&stime);
   1758 				slp = t;
   1759 			} else {
   1760 				getmicrotime(&now);
   1761 				slp = t - diff(now, stime);
   1762 			}
   1763 		}
   1764 		last_cc = qp->c_cc;
   1765 #undef diff
   1766 		if (slp > 0) {
   1767 			/*
   1768 			 * Convert deca-ticks back to ticks.
   1769 			 * Rounding down may make us wake up just short
   1770 			 * of the target, so we round up.
   1771 			 * Maybe we should do 'slp/10 + 1' because the
   1772 			 * first tick maybe almost immediate.
   1773 			 * However it is more useful for a program that sets
   1774 			 * VTIME=10 to wakeup every second not every 1.01
   1775 			 * seconds (if hz=100).
   1776 			 */
   1777 			slp = (slp + 9)/ 10;
   1778 			goto sleep;
   1779 		}
   1780 	} else if ((qp = &tp->t_canq)->c_cc <= 0) {
   1781 		int	carrier;
   1782 
   1783  sleep:
   1784 		/*
   1785 		 * If there is no input, sleep on rawq
   1786 		 * awaiting hardware receipt and notification.
   1787 		 * If we have data, we don't need to check for carrier.
   1788 		 */
   1789 		carrier = CONNECTED(tp);
   1790 		if (!carrier && ISSET(tp->t_state, TS_ISOPEN)) {
   1791 			mutex_spin_exit(&tty_lock);
   1792 			return (0);	/* EOF */
   1793 		}
   1794 		if (flag & IO_NDELAY) {
   1795 			mutex_spin_exit(&tty_lock);
   1796 			return (EWOULDBLOCK);
   1797 		}
   1798 		error = ttysleep(tp, &tp->t_rawq.c_cv, true, slp);
   1799 		mutex_spin_exit(&tty_lock);
   1800 		/* VMIN == 0: any quantity read satisfies */
   1801 		if (cc[VMIN] == 0 && error == EWOULDBLOCK)
   1802 			return (0);
   1803 		if (error && error != EWOULDBLOCK)
   1804 			return (error);
   1805 		goto loop;
   1806 	}
   1807  read:
   1808 	mutex_spin_exit(&tty_lock);
   1809 
   1810 	/*
   1811 	 * Input present, check for input mapping and processing.
   1812 	 */
   1813 	first = 1;
   1814 	while ((c = getc(qp)) >= 0) {
   1815 		/*
   1816 		 * delayed suspend (^Y)
   1817 		 */
   1818 		if (CCEQ(cc[VDSUSP], c) &&
   1819 		    ISSET(lflag, IEXTEN|ISIG) == (IEXTEN|ISIG)) {
   1820 			mutex_spin_enter(&tty_lock);
   1821 			ttysig(tp, TTYSIG_PG1, SIGTSTP);
   1822 			if (first) {
   1823 				error = ttysleep(tp, &lbolt, true, 0);
   1824 				mutex_spin_exit(&tty_lock);
   1825 				if (error)
   1826 					break;
   1827 				goto loop;
   1828 			} else
   1829 				mutex_spin_exit(&tty_lock);
   1830 			break;
   1831 		}
   1832 		/*
   1833 		 * Interpret EOF only in canonical mode.
   1834 		 */
   1835 		if (CCEQ(cc[VEOF], c) && ISSET(lflag, ICANON))
   1836 			break;
   1837 		/*
   1838 		 * Give user character.
   1839 		 */
   1840  		error = ureadc(c, uio);
   1841 		if (error)
   1842 			break;
   1843  		if (uio->uio_resid == 0)
   1844 			break;
   1845 		/*
   1846 		 * In canonical mode check for a "break character"
   1847 		 * marking the end of a "line of input".
   1848 		 */
   1849 		if (ISSET(lflag, ICANON) && TTBREAKC(c, lflag))
   1850 			break;
   1851 		first = 0;
   1852 	}
   1853 	/*
   1854 	 * Look to unblock output now that (presumably)
   1855 	 * the input queue has gone down.
   1856 	 */
   1857 	mutex_spin_enter(&tty_lock);
   1858 	if (ISSET(tp->t_state, TS_TBLOCK) && tp->t_rawq.c_cc < TTYHOG / 5) {
   1859 		if (ISSET(tp->t_iflag, IXOFF) &&
   1860 		    cc[VSTART] != _POSIX_VDISABLE &&
   1861 		    putc(cc[VSTART], &tp->t_outq) == 0) {
   1862 			CLR(tp->t_state, TS_TBLOCK);
   1863 			ttstart(tp);
   1864 		}
   1865 		/* Try to unblock remote output via hardware flow control. */
   1866 		if (ISSET(tp->t_cflag, CHWFLOW) && tp->t_hwiflow &&
   1867 		    (*tp->t_hwiflow)(tp, 0) != 0)
   1868 			CLR(tp->t_state, TS_TBLOCK);
   1869 	}
   1870 	mutex_spin_exit(&tty_lock);
   1871 
   1872 	return (error);
   1873 }
   1874 
   1875 /*
   1876  * Check the output queue on tp for space for a kernel message (from uprintf
   1877  * or tprintf).  Allow some space over the normal hiwater mark so we don't
   1878  * lose messages due to normal flow control, but don't let the tty run amok.
   1879  * Sleeps here are not interruptible, but we return prematurely if new signals
   1880  * arrive.
   1881  * Call with tty lock held.
   1882  */
   1883 static int
   1884 ttycheckoutq_wlock(struct tty *tp, int wait)
   1885 {
   1886 	int	hiwat, error;
   1887 
   1888 	KASSERT(mutex_owned(&tty_lock));
   1889 
   1890 	hiwat = tp->t_hiwat;
   1891 	if (tp->t_outq.c_cc > hiwat + 200)
   1892 		while (tp->t_outq.c_cc > hiwat) {
   1893 			ttstart(tp);
   1894 			if (wait == 0)
   1895 				return (0);
   1896 			error = ttysleep(tp, &tp->t_outq.c_cv, true, hz);
   1897 			if (error == EINTR)
   1898 				wait = 0;
   1899 		}
   1900 
   1901 	return (1);
   1902 }
   1903 
   1904 int
   1905 ttycheckoutq(struct tty *tp, int wait)
   1906 {
   1907 	int	r;
   1908 
   1909 	mutex_spin_enter(&tty_lock);
   1910 	r = ttycheckoutq_wlock(tp, wait);
   1911 	mutex_spin_exit(&tty_lock);
   1912 
   1913 	return (r);
   1914 }
   1915 
   1916 /*
   1917  * Process a write call on a tty device.
   1918  */
   1919 int
   1920 ttwrite(struct tty *tp, struct uio *uio, int flag)
   1921 {
   1922 	u_char		*cp;
   1923 	struct proc	*p;
   1924 	int		cc, ce, i, hiwat, error;
   1925 	size_t		cnt;
   1926 	u_char		obuf[OBUFSIZ];
   1927 
   1928 	cp = NULL;
   1929 	hiwat = tp->t_hiwat;
   1930 	cnt = uio->uio_resid;
   1931 	error = 0;
   1932 	cc = 0;
   1933  loop:
   1934 	mutex_spin_enter(&tty_lock);
   1935 	if (!CONNECTED(tp)) {
   1936 		if (ISSET(tp->t_state, TS_ISOPEN)) {
   1937 			mutex_spin_exit(&tty_lock);
   1938 			return (EIO);
   1939 		} else if (flag & IO_NDELAY) {
   1940 			mutex_spin_exit(&tty_lock);
   1941 			error = EWOULDBLOCK;
   1942 			goto out;
   1943 		} else {
   1944 			/* Sleep awaiting carrier. */
   1945 			error = ttysleep(tp, &tp->t_rawq.c_cv, true, 0);
   1946 			mutex_spin_exit(&tty_lock);
   1947 			if (error)
   1948 				goto out;
   1949 			goto loop;
   1950 		}
   1951 	}
   1952 
   1953 	/*
   1954 	 * Hang the process if it's in the background.
   1955 	 */
   1956 	p = curproc;
   1957 	if (isbackground(p, tp) &&
   1958 	    ISSET(tp->t_lflag, TOSTOP) && (p->p_sflag & PS_PPWAIT) == 0 &&
   1959 	    !sigismember(&p->p_sigctx.ps_sigignore, SIGTTOU) &&
   1960 	    !sigismember(&curlwp->l_sigmask, SIGTTOU)) {
   1961 		if (p->p_pgrp->pg_jobc == 0) {
   1962 			error = EIO;
   1963 			mutex_spin_exit(&tty_lock);
   1964 			goto out;
   1965 		}
   1966 		mutex_spin_exit(&tty_lock);
   1967 
   1968 		mutex_enter(proc_lock);
   1969 		pgsignal(p->p_pgrp, SIGTTOU, 1);
   1970 		mutex_exit(proc_lock);
   1971 
   1972 		mutex_spin_enter(&tty_lock);
   1973 		error = ttysleep(tp, &lbolt, true, 0);
   1974 		mutex_spin_exit(&tty_lock);
   1975 		if (error)
   1976 			goto out;
   1977 		goto loop;
   1978 	}
   1979 	mutex_spin_exit(&tty_lock);
   1980 
   1981 	/*
   1982 	 * Process the user's data in at most OBUFSIZ chunks.  Perform any
   1983 	 * output translation.  Keep track of high water mark, sleep on
   1984 	 * overflow awaiting device aid in acquiring new space.
   1985 	 */
   1986 	while (uio->uio_resid > 0 || cc > 0) {
   1987 		if (ISSET(tp->t_lflag, FLUSHO)) {
   1988 			uio->uio_resid = 0;
   1989 			return (0);
   1990 		}
   1991 		if (tp->t_outq.c_cc > hiwat)
   1992 			goto ovhiwat;
   1993 		/*
   1994 		 * Grab a hunk of data from the user, unless we have some
   1995 		 * leftover from last time.
   1996 		 */
   1997 		if (cc == 0) {
   1998 			cc = min(uio->uio_resid, OBUFSIZ);
   1999 			cp = obuf;
   2000 			error = uiomove(cp, cc, uio);
   2001 			if (error) {
   2002 				cc = 0;
   2003 				goto out;
   2004 			}
   2005 		}
   2006 		/*
   2007 		 * If nothing fancy need be done, grab those characters we
   2008 		 * can handle without any of ttyoutput's processing and
   2009 		 * just transfer them to the output q.  For those chars
   2010 		 * which require special processing (as indicated by the
   2011 		 * bits in char_type), call ttyoutput.  After processing
   2012 		 * a hunk of data, look for FLUSHO so ^O's will take effect
   2013 		 * immediately.
   2014 		 */
   2015 		mutex_spin_enter(&tty_lock);
   2016 		while (cc > 0) {
   2017 			if (!ISSET(tp->t_oflag, OPOST))
   2018 				ce = cc;
   2019 			else {
   2020 				ce = cc - scanc((u_int)cc, cp, char_type,
   2021 				    CCLASSMASK);
   2022 				/*
   2023 				 * If ce is zero, then we're processing
   2024 				 * a special character through ttyoutput.
   2025 				 */
   2026 				if (ce == 0) {
   2027 					tp->t_rocount = 0;
   2028 					if (ttyoutput(*cp, tp) >= 0) {
   2029 						/* out of space */
   2030 						mutex_spin_exit(&tty_lock);
   2031 						goto overfull;
   2032 					}
   2033 					cp++;
   2034 					cc--;
   2035 					if (ISSET(tp->t_lflag, FLUSHO) ||
   2036 					    tp->t_outq.c_cc > hiwat) {
   2037 						mutex_spin_exit(&tty_lock);
   2038 						goto ovhiwat;
   2039 					}
   2040 					continue;
   2041 				}
   2042 			}
   2043 			/*
   2044 			 * A bunch of normal characters have been found.
   2045 			 * Transfer them en masse to the output queue and
   2046 			 * continue processing at the top of the loop.
   2047 			 * If there are any further characters in this
   2048 			 * <= OBUFSIZ chunk, the first should be a character
   2049 			 * requiring special handling by ttyoutput.
   2050 			 */
   2051 			tp->t_rocount = 0;
   2052 			i = b_to_q(cp, ce, &tp->t_outq);
   2053 			ce -= i;
   2054 			tp->t_column += ce;
   2055 			cp += ce, cc -= ce, tk_nout += ce;
   2056 			tp->t_outcc += ce;
   2057 			if (i > 0) {
   2058 				/* out of space */
   2059 				mutex_spin_exit(&tty_lock);
   2060 				goto overfull;
   2061 			}
   2062 			if (ISSET(tp->t_lflag, FLUSHO) ||
   2063 			    tp->t_outq.c_cc > hiwat)
   2064 				break;
   2065 		}
   2066 		ttstart(tp);
   2067 		mutex_spin_exit(&tty_lock);
   2068 	}
   2069 
   2070  out:
   2071 	/*
   2072 	 * If cc is nonzero, we leave the uio structure inconsistent, as the
   2073 	 * offset and iov pointers have moved forward, but it doesn't matter
   2074 	 * (the call will either return short or restart with a new uio).
   2075 	 */
   2076 	uio->uio_resid += cc;
   2077 	return (error);
   2078 
   2079  overfull:
   2080 	/*
   2081 	 * Since we are using ring buffers, if we can't insert any more into
   2082 	 * the output queue, we can assume the ring is full and that someone
   2083 	 * forgot to set the high water mark correctly.  We set it and then
   2084 	 * proceed as normal.
   2085 	 */
   2086 	hiwat = tp->t_outq.c_cc - 1;
   2087 
   2088  ovhiwat:
   2089 	mutex_spin_enter(&tty_lock);
   2090 	ttstart(tp);
   2091 	/*
   2092 	 * This can only occur if FLUSHO is set in t_lflag,
   2093 	 * or if ttstart/oproc is synchronous (or very fast).
   2094 	 */
   2095 	if (tp->t_outq.c_cc <= hiwat) {
   2096 		mutex_spin_exit(&tty_lock);
   2097 		goto loop;
   2098 	}
   2099 	if (flag & IO_NDELAY) {
   2100 		mutex_spin_exit(&tty_lock);
   2101 		error = EWOULDBLOCK;
   2102 		goto out;
   2103 	}
   2104 	error = ttysleep(tp, &tp->t_outq.c_cv, true, 0);
   2105 	mutex_spin_exit(&tty_lock);
   2106 	if (error)
   2107 		goto out;
   2108 	goto loop;
   2109 }
   2110 
   2111 /*
   2112  * Try to pull more output from the producer.  Return non-zero if
   2113  * there is output ready to be sent.
   2114  */
   2115 bool
   2116 ttypull(struct tty *tp)
   2117 {
   2118 
   2119 	/* XXXSMP not yet KASSERT(mutex_owned(&tty_lock)); */
   2120 
   2121 	if (tp->t_outq.c_cc <= tp->t_lowat) {
   2122 		clwakeup(&tp->t_outq);
   2123 		selnotify(&tp->t_wsel, 0, NOTE_SUBMIT);
   2124 	}
   2125 	return tp->t_outq.c_cc != 0;
   2126 }
   2127 
   2128 /*
   2129  * Rubout one character from the rawq of tp
   2130  * as cleanly as possible.
   2131  * Called with tty lock held.
   2132  */
   2133 void
   2134 ttyrub(int c, struct tty *tp)
   2135 {
   2136 	u_char	*cp;
   2137 	int	savecol, tabc;
   2138 
   2139 	KASSERT(mutex_owned(&tty_lock));
   2140 
   2141 	if (!ISSET(tp->t_lflag, ECHO) || ISSET(tp->t_lflag, EXTPROC))
   2142 		return;
   2143 	CLR(tp->t_lflag, FLUSHO);
   2144 	if (ISSET(tp->t_lflag, ECHOE)) {
   2145 		if (tp->t_rocount == 0) {
   2146 			/*
   2147 			 * Screwed by ttwrite; retype
   2148 			 */
   2149 			ttyretype(tp);
   2150 			return;
   2151 		}
   2152 		if (c == ('\t' | TTY_QUOTE) || c == ('\n' | TTY_QUOTE))
   2153 			ttyrubo(tp, 2);
   2154 		else {
   2155 			CLR(c, ~TTY_CHARMASK);
   2156 			switch (CCLASS(c)) {
   2157 			case ORDINARY:
   2158 				ttyrubo(tp, 1);
   2159 				break;
   2160 			case BACKSPACE:
   2161 			case CONTROL:
   2162 			case NEWLINE:
   2163 			case RETURN:
   2164 			case VTAB:
   2165 				if (ISSET(tp->t_lflag, ECHOCTL))
   2166 					ttyrubo(tp, 2);
   2167 				break;
   2168 			case TAB:
   2169 				if (tp->t_rocount < tp->t_rawq.c_cc) {
   2170 					ttyretype(tp);
   2171 					return;
   2172 				}
   2173 				savecol = tp->t_column;
   2174 				SET(tp->t_state, TS_CNTTB);
   2175 				SET(tp->t_lflag, FLUSHO);
   2176 				tp->t_column = tp->t_rocol;
   2177 				for (cp = firstc(&tp->t_rawq, &tabc); cp;
   2178 				    cp = nextc(&tp->t_rawq, cp, &tabc))
   2179 					ttyecho(tabc, tp);
   2180 				CLR(tp->t_lflag, FLUSHO);
   2181 				CLR(tp->t_state, TS_CNTTB);
   2182 
   2183 				/* savecol will now be length of the tab. */
   2184 				savecol -= tp->t_column;
   2185 				tp->t_column += savecol;
   2186 				if (savecol > 8)
   2187 					savecol = 8;	/* overflow screw */
   2188 				while (--savecol >= 0)
   2189 					(void)ttyoutput('\b', tp);
   2190 				break;
   2191 			default:			/* XXX */
   2192 				(void)printf("ttyrub: would panic c = %d, "
   2193 				    "val = %d\n", c, CCLASS(c));
   2194 			}
   2195 		}
   2196 	} else if (ISSET(tp->t_lflag, ECHOPRT)) {
   2197 		if (!ISSET(tp->t_state, TS_ERASE)) {
   2198 			SET(tp->t_state, TS_ERASE);
   2199 			(void)ttyoutput('\\', tp);
   2200 		}
   2201 		ttyecho(c, tp);
   2202 	} else
   2203 		ttyecho(tp->t_cc[VERASE], tp);
   2204 	--tp->t_rocount;
   2205 }
   2206 
   2207 /*
   2208  * Back over cnt characters, erasing them.
   2209  * Called with tty lock held.
   2210  */
   2211 static void
   2212 ttyrubo(struct tty *tp, int cnt)
   2213 {
   2214 
   2215 	KASSERT(mutex_owned(&tty_lock));
   2216 
   2217 	while (cnt-- > 0) {
   2218 		(void)ttyoutput('\b', tp);
   2219 		(void)ttyoutput(' ', tp);
   2220 		(void)ttyoutput('\b', tp);
   2221 	}
   2222 }
   2223 
   2224 /*
   2225  * ttyretype --
   2226  *	Reprint the rawq line.  Note, it is assumed that c_cc has already
   2227  *	been checked.
   2228  *
   2229  * Called with tty lock held.
   2230  */
   2231 void
   2232 ttyretype(struct tty *tp)
   2233 {
   2234 	u_char	*cp;
   2235 	int	c;
   2236 
   2237 	KASSERT(mutex_owned(&tty_lock));
   2238 
   2239 	/* Echo the reprint character. */
   2240 	if (tp->t_cc[VREPRINT] != _POSIX_VDISABLE)
   2241 		ttyecho(tp->t_cc[VREPRINT], tp);
   2242 
   2243 	(void)ttyoutput('\n', tp);
   2244 
   2245 	for (cp = firstc(&tp->t_canq, &c); cp; cp = nextc(&tp->t_canq, cp, &c))
   2246 		ttyecho(c, tp);
   2247 	for (cp = firstc(&tp->t_rawq, &c); cp; cp = nextc(&tp->t_rawq, cp, &c))
   2248 		ttyecho(c, tp);
   2249 	CLR(tp->t_state, TS_ERASE);
   2250 
   2251 	tp->t_rocount = tp->t_rawq.c_cc;
   2252 	tp->t_rocol = 0;
   2253 }
   2254 
   2255 /*
   2256  * Echo a typed character to the terminal.
   2257  * Called with tty lock held.
   2258  */
   2259 static void
   2260 ttyecho(int c, struct tty *tp)
   2261 {
   2262 
   2263 	KASSERT(mutex_owned(&tty_lock));
   2264 
   2265 	if (!ISSET(tp->t_state, TS_CNTTB))
   2266 		CLR(tp->t_lflag, FLUSHO);
   2267 	if ((!ISSET(tp->t_lflag, ECHO) &&
   2268 	    (!ISSET(tp->t_lflag, ECHONL) || c != '\n')) ||
   2269 	    ISSET(tp->t_lflag, EXTPROC))
   2270 		return;
   2271 	if (((ISSET(tp->t_lflag, ECHOCTL) &&
   2272 	    (ISSET(c, TTY_CHARMASK) <= 037 && c != '\t' && c != '\n')) ||
   2273 	    ISSET(c, TTY_CHARMASK) == 0177)) {
   2274 		(void)ttyoutput('^', tp);
   2275 		CLR(c, ~TTY_CHARMASK);
   2276 		if (c == 0177)
   2277 			c = '?';
   2278 		else
   2279 			c += 'A' - 1;
   2280 	}
   2281 	(void)ttyoutput(c, tp);
   2282 }
   2283 
   2284 /*
   2285  * Wake up any readers on a tty.
   2286  * Called with tty lock held.
   2287  */
   2288 void
   2289 ttwakeup(struct tty *tp)
   2290 {
   2291 
   2292 	KASSERT(mutex_owned(&tty_lock));
   2293 
   2294 	selnotify(&tp->t_rsel, 0, NOTE_SUBMIT);
   2295 	if (ISSET(tp->t_state, TS_ASYNC))
   2296 		ttysig(tp, TTYSIG_PG2, SIGIO);
   2297 #if 0
   2298 	/* XXX tp->t_rawq.c_cv.cv_waiters dropping to zero early!? */
   2299 	clwakeup(&tp->t_rawq);
   2300 #else
   2301 	cv_wakeup(&tp->t_rawq.c_cv);
   2302 #endif
   2303 }
   2304 
   2305 /*
   2306  * Look up a code for a specified speed in a conversion table;
   2307  * used by drivers to map software speed values to hardware parameters.
   2308  */
   2309 int
   2310 ttspeedtab(int speed, const struct speedtab *table)
   2311 {
   2312 
   2313 	for (; table->sp_speed != -1; table++)
   2314 		if (table->sp_speed == speed)
   2315 			return (table->sp_code);
   2316 	return (-1);
   2317 }
   2318 
   2319 /*
   2320  * Set tty hi and low water marks.
   2321  *
   2322  * Try to arrange the dynamics so there's about one second
   2323  * from hi to low water.
   2324  */
   2325 void
   2326 ttsetwater(struct tty *tp)
   2327 {
   2328 	int	cps, x;
   2329 
   2330 	/* XXX not yet KASSERT(mutex_owned(&tty_lock)); */
   2331 
   2332 #define	CLAMP(x, h, l)	((x) > h ? h : ((x) < l) ? l : (x))
   2333 
   2334 	cps = tp->t_ospeed / 10;
   2335 	tp->t_lowat = x = CLAMP(cps / 2, TTMAXLOWAT, TTMINLOWAT);
   2336 	x += cps;
   2337 	x = CLAMP(x, TTMAXHIWAT, TTMINHIWAT);
   2338 	tp->t_hiwat = roundup(x, CBSIZE);
   2339 #undef	CLAMP
   2340 }
   2341 
   2342 /*
   2343  * Prepare report on state of foreground process group.
   2344  * Call with proc_lock held.
   2345  */
   2346 void
   2347 ttygetinfo(struct tty *tp, int fromsig, char *buf, size_t bufsz)
   2348 {
   2349 	struct lwp	*l;
   2350 	struct proc	*p, *pick = NULL;
   2351 	struct timeval	utime, stime;
   2352 	int		tmp;
   2353 	fixpt_t		pctcpu = 0;
   2354 	const char	*msg;
   2355 	char		lmsg[100];
   2356 	long		rss;
   2357 
   2358 	KASSERT(mutex_owned(proc_lock));
   2359 
   2360 	*buf = '\0';
   2361 
   2362 	if (tp->t_session == NULL)
   2363 		msg = "not a controlling terminal\n";
   2364 	else if (tp->t_pgrp == NULL)
   2365 		msg = "no foreground process group\n";
   2366 	else if ((p = LIST_FIRST(&tp->t_pgrp->pg_members)) == NULL)
   2367 		msg = "empty foreground process group\n";
   2368 	else {
   2369 		/* Pick interesting process. */
   2370 		for (; p != NULL; p = LIST_NEXT(p, p_pglist)) {
   2371 			struct proc *oldpick;
   2372 
   2373 			if (pick == NULL) {
   2374 				pick = p;
   2375 				continue;
   2376 			}
   2377 			if (pick < p) {
   2378 				mutex_enter(&pick->p_smutex);
   2379 				mutex_enter(&p->p_smutex);
   2380 			} else {
   2381 				mutex_enter(&p->p_smutex);
   2382 				mutex_enter(&pick->p_smutex);
   2383 			}
   2384 			oldpick = pick;
   2385 			if (proc_compare(pick, p))
   2386 				pick = p;
   2387 			mutex_exit(&p->p_smutex);
   2388 			mutex_exit(&oldpick->p_smutex);
   2389 		}
   2390 		if (fromsig &&
   2391 		    (SIGACTION_PS(pick->p_sigacts, SIGINFO).sa_flags &
   2392 		    SA_NOKERNINFO))
   2393 			return;
   2394 		msg = NULL;
   2395 	}
   2396 
   2397 	/* Print load average. */
   2398 	tmp = (averunnable.ldavg[0] * 100 + FSCALE / 2) >> FSHIFT;
   2399 	snprintf(lmsg, sizeof(lmsg), "load: %d.%02d ", tmp / 100, tmp % 100);
   2400 	strlcat(buf, lmsg, bufsz);
   2401 
   2402 	if (pick == NULL) {
   2403 		strlcat(buf, msg, bufsz);
   2404 		return;
   2405 	}
   2406 
   2407 	snprintf(lmsg, sizeof(lmsg), " cmd: %s %d [", pick->p_comm,
   2408 	    pick->p_pid);
   2409 	strlcat(buf, lmsg, bufsz);
   2410 
   2411 	mutex_enter(&pick->p_smutex);
   2412 	LIST_FOREACH(l, &pick->p_lwps, l_sibling) {
   2413 		lwp_lock(l);
   2414 		snprintf(lmsg, sizeof(lmsg), "%s%s",
   2415 		    l->l_stat == LSONPROC ? "running" :
   2416 		    l->l_stat == LSRUN ? "runnable" :
   2417 		    l->l_wchan ? l->l_wmesg : "iowait",
   2418 		    (LIST_NEXT(l, l_sibling) != NULL) ? " " : "] ");
   2419 		lwp_unlock(l);
   2420 		strlcat(buf, lmsg, bufsz);
   2421 		pctcpu += l->l_pctcpu;
   2422 	}
   2423 	pctcpu += pick->p_pctcpu;
   2424 	calcru(pick, &utime, &stime, NULL, NULL);
   2425 	mutex_exit(&pick->p_smutex);
   2426 
   2427 	/* Round up and print user+system time, %CPU and RSS. */
   2428 	utime.tv_usec += 5000;
   2429 	if (utime.tv_usec >= 1000000) {
   2430 		utime.tv_sec += 1;
   2431 		utime.tv_usec -= 1000000;
   2432 	}
   2433 	stime.tv_usec += 5000;
   2434 	if (stime.tv_usec >= 1000000) {
   2435 		stime.tv_sec += 1;
   2436 		stime.tv_usec -= 1000000;
   2437 	}
   2438 #define	pgtok(a)	(((u_long) ((a) * PAGE_SIZE) / 1024))
   2439 	tmp = (pctcpu * 10000 + FSCALE / 2) >> FSHIFT;
   2440 	if (pick->p_stat == SIDL || P_ZOMBIE(pick))
   2441 		rss = 0;
   2442 	else
   2443 		rss = pgtok(vm_resident_count(pick->p_vmspace));
   2444 
   2445 	snprintf(lmsg, sizeof(lmsg), "%ld.%02ldu %ld.%02lds %d%% %ldk",
   2446 	    (long)utime.tv_sec, (long)utime.tv_usec / 10000,
   2447 	    (long)stime.tv_sec, (long)stime.tv_usec / 10000,
   2448 	    tmp / 100, rss);
   2449 	strlcat(buf, lmsg, bufsz);
   2450 }
   2451 
   2452 /*
   2453  * Print report on state of foreground process group.
   2454  * Call with tty_lock held.
   2455  */
   2456 void
   2457 ttyputinfo(struct tty *tp, char *buf)
   2458 {
   2459 
   2460 	KASSERT(mutex_owned(&tty_lock));
   2461 
   2462 	if (ttycheckoutq_wlock(tp, 0) == 0)
   2463 		return;
   2464 	ttyprintf_nolock(tp, "%s\n", buf);
   2465 	tp->t_rocount = 0;	/* so pending input will be retyped if BS */
   2466 }
   2467 
   2468 /*
   2469  * Returns 1 if p2 is "better" than p1
   2470  *
   2471  * The algorithm for picking the "interesting" process is thus:
   2472  *
   2473  *	1) Only foreground processes are eligible - implied.
   2474  *	2) Runnable processes are favored over anything else.  The runner
   2475  *	   with the highest CPU utilization is picked (l_pctcpu).  Ties are
   2476  *	   broken by picking the highest pid.
   2477  *	3) The sleeper with the shortest sleep time is next.  With ties,
   2478  *	   we pick out just "short-term" sleepers (P_SINTR == 0).
   2479  *	4) Further ties are broken by picking the highest pid.
   2480  */
   2481 #define	ISRUN(p)	((p)->p_nrlwps > 0)
   2482 #define	TESTAB(a, b)	((a)<<1 | (b))
   2483 #define	ONLYA	2
   2484 #define	ONLYB	1
   2485 #define	BOTH	3
   2486 
   2487 static int
   2488 proc_compare(struct proc *p1, struct proc *p2)
   2489 {
   2490 	lwp_t *l1, *l2;
   2491 
   2492 	KASSERT(mutex_owned(&p1->p_smutex));
   2493 	KASSERT(mutex_owned(&p2->p_smutex));
   2494 
   2495 	if ((l1 = LIST_FIRST(&p1->p_lwps)) == NULL)
   2496 		return (1);
   2497 	if ((l2 = LIST_FIRST(&p2->p_lwps)) == NULL)
   2498 		return (0);
   2499 	/*
   2500 	 * see if at least one of them is runnable
   2501 	 */
   2502 	switch (TESTAB(ISRUN(p1), ISRUN(p2))) {
   2503 	case ONLYA:
   2504 		return (0);
   2505 	case ONLYB:
   2506 		return (1);
   2507 	case BOTH:
   2508 		/*
   2509 		 * tie - favor one with highest recent CPU utilization
   2510 		 */
   2511 		if (l2->l_pctcpu > l1->l_pctcpu)
   2512 			return (1);
   2513 		return (p2->p_pid > p1->p_pid);	/* tie - return highest pid */
   2514 	}
   2515 	/*
   2516  	 * weed out zombies
   2517 	 */
   2518 	switch (TESTAB(P_ZOMBIE(p1), P_ZOMBIE(p2))) {
   2519 	case ONLYA:
   2520 		return (1);
   2521 	case ONLYB:
   2522 		return (0);
   2523 	case BOTH:
   2524 		return (p2->p_pid > p1->p_pid);	/* tie - return highest pid */
   2525 	}
   2526 	/*
   2527 	 * pick the one with the smallest sleep time
   2528 	 */
   2529 	if (l2->l_slptime > l2->l_slptime)
   2530 		return (0);
   2531 	if (l2->l_slptime > l2->l_slptime)
   2532 		return (1);
   2533 	/*
   2534 	 * favor one sleeping in a non-interruptible sleep
   2535 	 */
   2536 	if (l2->l_flag & LW_SINTR && (l2->l_flag & LW_SINTR) == 0)
   2537 		return (1);
   2538 	if (l2->l_flag & LW_SINTR && (l2->l_flag & LW_SINTR) == 0)
   2539 		return (0);
   2540 	return (p2->p_pid > p1->p_pid);		/* tie - return highest pid */
   2541 }
   2542 
   2543 /*
   2544  * Output char to tty; console putchar style.
   2545  * Can be called with tty lock held through kprintf() machinery..
   2546  */
   2547 int
   2548 tputchar(int c, int flags, struct tty *tp)
   2549 {
   2550 	int r = 0;
   2551 
   2552 	if ((flags & NOLOCK) == 0)
   2553 		mutex_spin_enter(&tty_lock);
   2554 	if (!CONNECTED(tp)) {
   2555 		r = -1;
   2556 		goto out;
   2557 	}
   2558 	if (c == '\n')
   2559 		(void)ttyoutput('\r', tp);
   2560 	(void)ttyoutput(c, tp);
   2561 	ttstart(tp);
   2562 out:
   2563 	if ((flags & NOLOCK) == 0)
   2564 		mutex_spin_exit(&tty_lock);
   2565 	return (r);
   2566 }
   2567 
   2568 /*
   2569  * Sleep on chan, returning ERESTART if tty changed while we napped and
   2570  * returning any errors (e.g. EINTR/ETIMEDOUT) reported by tsleep.  If
   2571  * the tty is revoked, restarting a pending call will redo validation done
   2572  * at the start of the call.
   2573  *
   2574  * Must be called with the tty lock held.
   2575  */
   2576 int
   2577 ttysleep(struct tty *tp, kcondvar_t *cv, bool catch, int timo)
   2578 {
   2579 	int	error;
   2580 	short	gen;
   2581 
   2582 	KASSERT(mutex_owned(&tty_lock));
   2583 
   2584 	gen = tp->t_gen;
   2585 	if (catch)
   2586 		error = cv_timedwait_sig(cv, &tty_lock, timo);
   2587 	else
   2588 		error = cv_timedwait(cv, &tty_lock, timo);
   2589 	if (error != 0)
   2590 		return (error);
   2591 	return (tp->t_gen == gen ? 0 : ERESTART);
   2592 }
   2593 
   2594 /*
   2595  * Attach a tty to the tty list.
   2596  *
   2597  * This should be called ONLY once per real tty (including pty's).
   2598  * eg, on the sparc, the keyboard and mouse have struct tty's that are
   2599  * distinctly NOT usable as tty's, and thus should not be attached to
   2600  * the ttylist.  This is why this call is not done from ttymalloc().
   2601  *
   2602  * Device drivers should attach tty's at a similar time that they are
   2603  * ttymalloc()'ed, or, for the case of statically allocated struct tty's
   2604  * either in the attach or (first) open routine.
   2605  */
   2606 void
   2607 tty_attach(struct tty *tp)
   2608 {
   2609 
   2610 	mutex_spin_enter(&tty_lock);
   2611 	TAILQ_INSERT_TAIL(&ttylist, tp, tty_link);
   2612 	++tty_count;
   2613 	mutex_spin_exit(&tty_lock);
   2614 }
   2615 
   2616 /*
   2617  * Remove a tty from the tty list.
   2618  */
   2619 void
   2620 tty_detach(struct tty *tp)
   2621 {
   2622 
   2623 	mutex_spin_enter(&tty_lock);
   2624 	--tty_count;
   2625 #ifdef DIAGNOSTIC
   2626 	if (tty_count < 0)
   2627 		panic("tty_detach: tty_count < 0");
   2628 #endif
   2629 	TAILQ_REMOVE(&ttylist, tp, tty_link);
   2630 	mutex_spin_exit(&tty_lock);
   2631 }
   2632 
   2633 /*
   2634  * Allocate a tty structure and its associated buffers.
   2635  */
   2636 struct tty *
   2637 ttymalloc(void)
   2638 {
   2639 	struct tty	*tp;
   2640 	int i;
   2641 
   2642 	tp = kmem_zalloc(sizeof(*tp), KM_SLEEP);
   2643 	callout_init(&tp->t_rstrt_ch, 0);
   2644 	callout_setfunc(&tp->t_rstrt_ch, ttrstrt, tp);
   2645 	/* XXX: default to 1024 chars for now */
   2646 	clalloc(&tp->t_rawq, 1024, 1);
   2647 	clalloc(&tp->t_canq, 1024, 1);
   2648 	/* output queue doesn't need quoting */
   2649 	clalloc(&tp->t_outq, 1024, 0);
   2650 	/* Set default line discipline. */
   2651 	tp->t_linesw = ttyldisc_default();
   2652 	selinit(&tp->t_rsel);
   2653 	selinit(&tp->t_wsel);
   2654 	for (i = 0; i < TTYSIG_COUNT; i++)
   2655 		sigemptyset(&tp->t_sigs[i]);
   2656 	return (tp);
   2657 }
   2658 
   2659 /*
   2660  * Free a tty structure and its buffers.
   2661  *
   2662  * Be sure to call tty_detach() for any tty that has been
   2663  * tty_attach()ed.
   2664  */
   2665 void
   2666 ttyfree(struct tty *tp)
   2667 {
   2668 	int i;
   2669 
   2670 	mutex_enter(proc_lock);
   2671 	mutex_enter(&tty_lock);
   2672 	for (i = 0; i < TTYSIG_COUNT; i++)
   2673 		sigemptyset(&tp->t_sigs[i]);
   2674 	if (tp->t_sigcount != 0)
   2675 		TAILQ_REMOVE(&tty_sigqueue, tp, t_sigqueue);
   2676 	mutex_exit(&tty_lock);
   2677 	mutex_exit(proc_lock);
   2678 
   2679 	callout_halt(&tp->t_rstrt_ch, NULL);
   2680 	callout_destroy(&tp->t_rstrt_ch);
   2681 	ttyldisc_release(tp->t_linesw);
   2682 	clfree(&tp->t_rawq);
   2683 	clfree(&tp->t_canq);
   2684 	clfree(&tp->t_outq);
   2685 	seldestroy(&tp->t_rsel);
   2686 	seldestroy(&tp->t_wsel);
   2687 	kmem_free(tp, sizeof(*tp));
   2688 }
   2689 
   2690 /*
   2691  * ttyprintf_nolock: send a message to a specific tty, without locking.
   2692  *
   2693  * => should be used only by tty driver or anything that knows the
   2694  *    underlying tty will not be revoked(2)'d away.  [otherwise,
   2695  *    use tprintf]
   2696  */
   2697 static void
   2698 ttyprintf_nolock(struct tty *tp, const char *fmt, ...)
   2699 {
   2700 	va_list ap;
   2701 
   2702 	/* No mutex needed; going to process TTY. */
   2703 	va_start(ap, fmt);
   2704 	kprintf(fmt, TOTTY|NOLOCK, tp, NULL, ap);
   2705 	va_end(ap);
   2706 }
   2707 
   2708 /*
   2709  * Initialize the tty subsystem.
   2710  */
   2711 void
   2712 tty_init(void)
   2713 {
   2714 
   2715 	mutex_init(&tty_lock, MUTEX_DEFAULT, IPL_VM);
   2716 	tty_sigsih = softint_establish(SOFTINT_CLOCK, ttysigintr, NULL);
   2717 	KASSERT(tty_sigsih != NULL);
   2718 }
   2719 
   2720 /*
   2721  * Send a signal from a tty to its process group or session leader.
   2722  * Handoff to the target is deferred to a soft interrupt.
   2723  */
   2724 void
   2725 ttysig(struct tty *tp, enum ttysigtype st, int sig)
   2726 {
   2727 	sigset_t *sp;
   2728 
   2729 	/* XXXSMP not yet KASSERT(mutex_owned(&tty_lock)); */
   2730 
   2731 	sp = &tp->t_sigs[st];
   2732 	if (sigismember(sp, sig))
   2733 		return;
   2734 	sigaddset(sp, sig);
   2735 	if (tp->t_sigcount++ == 0)
   2736 		TAILQ_INSERT_TAIL(&tty_sigqueue, tp, t_sigqueue);
   2737 	softint_schedule(tty_sigsih);
   2738 }
   2739 
   2740 /*
   2741  * Deliver deferred signals from ttys.  Note that the process groups
   2742  * and sessions associated with the ttys may have changed from when
   2743  * the signal was originally sent, but in practice it should not matter.
   2744  * For signals produced as a result of a syscall, the soft interrupt
   2745  * will fire before the syscall returns to the user.
   2746  */
   2747 static void
   2748 ttysigintr(void *cookie)
   2749 {
   2750 	struct tty *tp;
   2751 	enum ttysigtype st;
   2752 	struct pgrp *pgrp;
   2753 	struct session *sess;
   2754 	int sig, lflag;
   2755 	char infobuf[200];
   2756 
   2757 	mutex_enter(proc_lock);
   2758 	mutex_spin_enter(&tty_lock);
   2759 	while ((tp = TAILQ_FIRST(&tty_sigqueue)) != NULL) {
   2760 		KASSERT(tp->t_sigcount > 0);
   2761 		for (st = 0; st < TTYSIG_COUNT; st++) {
   2762 			if ((sig = firstsig(&tp->t_sigs[st])) != 0)
   2763 				break;
   2764 		}
   2765 		KASSERT(st < TTYSIG_COUNT);
   2766 		sigdelset(&tp->t_sigs[st], sig);
   2767 		if (--tp->t_sigcount == 0)
   2768 			TAILQ_REMOVE(&tty_sigqueue, tp, t_sigqueue);
   2769 		pgrp = tp->t_pgrp;
   2770 		sess = tp->t_session;
   2771 		lflag = tp->t_lflag;
   2772 		if  (sig == SIGINFO) {
   2773 			if (ISSET(tp->t_state, TS_SIGINFO)) {
   2774 				/* Via ioctl: ignore tty option. */
   2775 				tp->t_state &= ~TS_SIGINFO;
   2776 				lflag |= ISIG;
   2777 			}
   2778 			if (!ISSET(lflag, NOKERNINFO)) {
   2779 				mutex_spin_exit(&tty_lock);
   2780 				ttygetinfo(tp, 1, infobuf, sizeof(infobuf));
   2781 				mutex_spin_enter(&tty_lock);
   2782 				ttyputinfo(tp, infobuf);
   2783 			}
   2784 			if (!ISSET(lflag, ISIG))
   2785 				continue;
   2786 		}
   2787 		mutex_spin_exit(&tty_lock);
   2788 		KASSERT(sig != 0);
   2789 		switch (st) {
   2790 		case TTYSIG_PG1:
   2791 			if (pgrp != NULL)
   2792 				pgsignal(pgrp, sig, 1);
   2793 			break;
   2794 		case TTYSIG_PG2:
   2795 			if (pgrp != NULL)
   2796 				pgsignal(pgrp, sig, sess != NULL);
   2797 			break;
   2798 		case TTYSIG_LEADER:
   2799 			if (sess != NULL && sess->s_leader != NULL)
   2800 				psignal(sess->s_leader, sig);
   2801 			break;
   2802 		default:
   2803 			/* NOTREACHED */
   2804 			break;
   2805 		}
   2806 		mutex_spin_enter(&tty_lock);
   2807 	}
   2808 	mutex_spin_exit(&tty_lock);
   2809 	mutex_exit(proc_lock);
   2810 }
   2811