4 * Copyright (c) 1982, 1986, 1990, 1991, 1993
5 * The Regents of the University of California. All rights reserved.
6 * (c) UNIX System Laboratories, Inc.
7 * All or some portions of this file are derived from material licensed
8 * to the University of California by American Telephone and Telegraph
9 * Co. or Unix System Laboratories, Inc. and are reproduced herein with
10 * the permission of UNIX System Laboratories, Inc.
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
15 * 1. Redistributions of source code must retain the above copyright
16 * notice, this list of conditions and the following disclaimer.
17 * 2. Redistributions in binary form must reproduce the above copyright
18 * notice, this list of conditions and the following disclaimer in the
19 * documentation and/or other materials provided with the distribution.
20 * 3. All advertising materials mentioning features or use of this software
21 * must display the following acknowledgement:
22 * This product includes software developed by the University of
23 * California, Berkeley and its contributors.
24 * 4. Neither the name of the University nor the names of its contributors
25 * may be used to endorse or promote products derived from this software
26 * without specific prior written permission.
28 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
29 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
30 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
31 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
32 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
36 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
37 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
40 * @(#)tty.c 8.8 (Berkeley) 1/21/94
41 * $FreeBSD: src/sys/kern/tty.c,v 1.129.2.5 2002/03/11 01:32:31 dd Exp $
42 * $DragonFly: src/sys/kern/tty.c,v 1.46 2008/09/10 09:50:09 y0netan1 Exp $
47 * Almost all functions in this file are acquiring the tty token due to their
48 * access and modifications of the 'tp' (struct tty) objects.
53 * o Fix races for sending the start char in ttyflush().
54 * o Handle inter-byte timeout for "MIN > 0, TIME > 0" in ttyselect().
55 * With luck, there will be MIN chars before select() returns().
56 * o Handle CLOCAL consistently for ptys. Perhaps disallow setting it.
57 * o Don't allow input in TS_ZOMBIE case. It would be visible through
59 * o Do the new sio locking stuff here and use it to avoid special
62 * o Move EXTPROC and/or PENDIN to t_state?
63 * o Wrap most of ttioctl in spltty/splx.
64 * o Implement TIOCNOTTY or remove it from <sys/ioctl.h>.
65 * o Send STOP if IXOFF is toggled off while TS_TBLOCK is set.
66 * o Don't allow certain termios flags to affect disciplines other
67 * than TTYDISC. Cancel their effects before switch disciplines
68 * and ignore them if they are set while we are in another
70 * o Now that historical speed conversions are handled here, don't
72 * o Check for TS_CARR_ON being set while everything is closed and not
73 * waiting for carrier. TS_CARR_ON isn't cleared if nothing is open,
74 * so it would live until the next open even if carrier drops.
75 * o Restore TS_WOPEN since it is useful in pstat. It must be cleared
76 * only when _all_ openers leave open().
79 #include "opt_compat.h"
80 #include "opt_uconsole.h"
82 #include <sys/param.h>
83 #include <sys/systm.h>
84 #include <sys/filio.h>
85 #if defined(COMPAT_43) || defined(COMPAT_SUNOS)
86 #include <sys/ioctl_compat.h>
92 #include <sys/clist.h>
94 #include <sys/fcntl.h>
96 #include <sys/dkstat.h>
97 #include <sys/kernel.h>
98 #include <sys/vnode.h>
99 #include <sys/signalvar.h>
100 #include <sys/signal2.h>
101 #include <sys/resourcevar.h>
102 #include <sys/malloc.h>
103 #include <sys/filedesc.h>
104 #include <sys/sysctl.h>
105 #include <sys/thread2.h>
108 #include <sys/lock.h>
110 #include <vm/vm_map.h>
112 MALLOC_DEFINE(M_TTYS, "ttys", "tty data structures");
114 static int proc_compare (struct proc *p1, struct proc *p2);
115 static int ttnread (struct tty *tp);
116 static void ttyecho (int c, struct tty *tp);
117 static int ttyoutput (int c, struct tty *tp);
118 static void ttypend (struct tty *tp);
119 static void ttyretype (struct tty *tp);
120 static void ttyrub (int c, struct tty *tp);
121 static void ttyrubo (struct tty *tp, int cnt);
122 static void ttyunblock (struct tty *tp);
123 static int ttywflush (struct tty *tp);
124 static int filt_ttyread (struct knote *kn, long hint);
125 static void filt_ttyrdetach (struct knote *kn);
126 static int filt_ttywrite (struct knote *kn, long hint);
127 static void filt_ttywdetach (struct knote *kn);
130 * Table with character classes and parity. The 8th bit indicates parity,
131 * the 7th bit indicates the character is an alphameric or underscore (for
132 * ALTWERASE), and the low 6 bits indicate delay type. If the low 6 bits
133 * are 0 then the character needs no special processing on output; classes
134 * other than 0 might be translated or (not currently) require delays.
136 #define E 0x00 /* Even parity. */
137 #define O 0x80 /* Odd parity. */
138 #define PARITY(c) (char_type[c] & O)
140 #define ALPHA 0x40 /* Alpha or underscore. */
141 #define ISALPHA(c) (char_type[(c) & TTY_CHARMASK] & ALPHA)
143 #define CCLASSMASK 0x3f
144 #define CCLASS(c) (char_type[c] & CCLASSMASK)
149 #define NA ORDINARY | ALPHA
155 static u_char const char_type[] = {
156 E|CC, O|CC, O|CC, E|CC, O|CC, E|CC, E|CC, O|CC, /* nul - bel */
157 O|BS, E|TB, E|NL, O|CC, E|VT, O|CR, O|CC, E|CC, /* bs - si */
158 O|CC, E|CC, E|CC, O|CC, E|CC, O|CC, O|CC, E|CC, /* dle - etb */
159 E|CC, O|CC, O|CC, E|CC, O|CC, E|CC, E|CC, O|CC, /* can - us */
160 O|NO, E|NO, E|NO, O|NO, E|NO, O|NO, O|NO, E|NO, /* sp - ' */
161 E|NO, O|NO, O|NO, E|NO, O|NO, E|NO, E|NO, O|NO, /* ( - / */
162 E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA, /* 0 - 7 */
163 O|NA, E|NA, E|NO, O|NO, E|NO, O|NO, O|NO, E|NO, /* 8 - ? */
164 O|NO, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA, /* @ - G */
165 E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA, /* H - O */
166 E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA, /* P - W */
167 O|NA, E|NA, E|NA, O|NO, E|NO, O|NO, O|NO, O|NA, /* X - _ */
168 E|NO, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA, /* ` - g */
169 O|NA, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA, /* h - o */
170 O|NA, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA, /* p - w */
171 E|NA, O|NA, O|NA, E|NO, O|NO, E|NO, E|NO, O|CC, /* x - del */
173 * Meta chars; should be settable per character set;
174 * for now, treat them all as normal characters.
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 NA, NA, NA, NA, NA, NA, NA, NA,
202 /* Macros to clear/set/test flags. */
203 #define SET(t, f) (t) |= (f)
204 #define CLR(t, f) (t) &= ~(f)
205 #define ISSET(t, f) ((t) & (f))
207 #undef MAX_INPUT /* XXX wrong in <sys/syslimits.h> */
208 #define MAX_INPUT TTYHOG /* XXX limit is usually larger for !ICANON */
211 SYSCTL_OPAQUE(_kern, OID_AUTO, tk_nin, CTLFLAG_RD, &tk_nin, sizeof(tk_nin),
212 "LU", "TTY input statistic");
214 SYSCTL_OPAQUE(_kern, OID_AUTO, tk_nout, CTLFLAG_RD, &tk_nout, sizeof(tk_nout),
215 "LU", "TTY output statistic");
219 * list of struct tty where pstat(8) can pick it up with sysctl
221 static TAILQ_HEAD(, tty) tty_list = TAILQ_HEAD_INITIALIZER(tty_list);
224 * Initial open of tty, or (re)entry to standard tty line discipline.
227 ttyopen(cdev_t device, struct tty *tp)
230 lwkt_gettoken(&tty_token);
232 if (!ISSET(tp->t_state, TS_ISOPEN)) {
233 SET(tp->t_state, TS_ISOPEN);
234 if (ISSET(tp->t_cflag, CLOCAL)) {
235 SET(tp->t_state, TS_CONNECTED);
237 bzero(&tp->t_winsize, sizeof(tp->t_winsize));
240 lwkt_reltoken(&tty_token);
246 * Handle close() on a tty line: flush and set to initial state,
247 * bumping generation number so that pending read/write calls
248 * can detect recycling of the tty.
250 * XXX our caller should have done `spltty(); l_close(); ttyclose();'
251 * and l_close() should have flushed, but we repeat the spltty() and
252 * the flush in case there are buggy callers.
255 ttyclose(struct tty *tp)
258 lwkt_gettoken(&tty_token);
259 funsetown(&tp->t_sigio);
263 ttyflush(tp, FREAD | FWRITE);
264 clist_free_cblocks(&tp->t_canq);
265 clist_free_cblocks(&tp->t_outq);
266 clist_free_cblocks(&tp->t_rawq);
269 tp->t_line = TTYDISC;
271 tp->t_state &= TS_REGISTERED; /* clear all bits except */
272 lwkt_reltoken(&tty_token);
278 * Disassociate the tty from its session. Traditionally this has only been
279 * a half-close, meaning that the session was still allowed to point at the
280 * tty (resulting in the tty in the ps command showing something like 'p0-'),
281 * even though the tty is no longer pointing at the session.
283 * The half close seems to be useful only for 'ps' output but there is as
284 * yet no reason to remove the feature. The full-close code is currently
285 * #if 0'd out. See also sess_rele() in kern/kern_proc.c.
288 ttyclearsession(struct tty *tp)
293 lwkt_gettoken(&tty_token);
301 if ((sp = tp->t_session) != NULL) {
302 tp->t_session = NULL;
303 #ifdef TTY_DO_FULL_CLOSE
304 /* FULL CLOSE (not yet) */
305 if (sp->s_ttyp == tp) {
309 kprintf("ttyclearsession: warning: sp->s_ttyp != tp "
310 "%p/%p\n", sp->s_ttyp, tp);
314 lwkt_reltoken(&tty_token);
318 * Release the tty vnode association for a session. This is the
319 * 'other half' of the close. Because multiple opens of /dev/tty
320 * only generate a single open to the actual tty, the file modes
321 * are locked to FREAD|FWRITE.
323 * If dorevoke is non-zero, the session is also revoked. We have to
324 * close the vnode if VCTTYISOPEN is set.
327 ttyclosesession(struct session *sp, int dorevoke)
331 lwkt_gettoken(&tty_token);
334 * There may not be a controlling terminal or it may have been closed
337 if ((vp = sp->s_ttyvp) == NULL) {
338 lwkt_reltoken(&tty_token);
343 * We need a lock if we have to close or revoke.
345 if ((vp->v_flag & VCTTYISOPEN) || dorevoke) {
347 if (vn_lock(vp, LK_EXCLUSIVE|LK_RETRY)) {
353 * Retry if the vnode was ripped out from under us
355 if (vp != sp->s_ttyvp) {
362 * Close and revoke as needed
365 if (vp->v_flag & VCTTYISOPEN) {
366 vclrflags(vp, VCTTYISOPEN);
367 VOP_CLOSE(vp, FREAD|FWRITE);
371 vrevoke(vp, proc0.p_ucred);
377 lwkt_reltoken(&tty_token);
380 #define FLUSHQ(q) { \
382 ndflush(q, (q)->c_cc); \
385 /* Is 'c' a line delimiter ("break" character)? */
386 #define TTBREAKC(c, lflag) \
387 ((c) == '\n' || (((c) == cc[VEOF] || \
388 (c) == cc[VEOL] || ((c) == cc[VEOL2] && lflag & IEXTEN)) && \
389 (c) != _POSIX_VDISABLE))
392 * Process input of a single character received on a tty.
395 ttyinput(int c, struct tty *tp)
397 tcflag_t iflag, lflag;
401 lwkt_gettoken(&tty_token);
403 * If input is pending take it first.
406 if (ISSET(lflag, PENDIN))
411 if (ISSET(lflag, ICANON))
418 * Block further input iff:
419 * current input > threshold AND input is available to user program
420 * AND input flow control is enabled and not yet invoked.
421 * The 3 is slop for PARMRK.
424 if (tp->t_rawq.c_cc + tp->t_canq.c_cc > tp->t_ihiwat - 3 &&
425 (!ISSET(lflag, ICANON) || tp->t_canq.c_cc != 0) &&
426 (ISSET(tp->t_cflag, CRTS_IFLOW) || ISSET(iflag, IXOFF)) &&
427 !ISSET(tp->t_state, TS_TBLOCK))
430 /* Handle exceptional conditions (break, parity, framing). */
432 err = (ISSET(c, TTY_ERRORMASK));
434 CLR(c, TTY_ERRORMASK);
435 if (ISSET(err, TTY_BI)) {
436 if (ISSET(iflag, IGNBRK)) {
437 lwkt_reltoken(&tty_token);
440 if (ISSET(iflag, BRKINT)) {
441 ttyflush(tp, FREAD | FWRITE);
442 pgsignal(tp->t_pgrp, SIGINT, 1);
445 if (ISSET(iflag, PARMRK))
447 } else if ((ISSET(err, TTY_PE) && ISSET(iflag, INPCK))
448 || ISSET(err, TTY_FE)) {
449 if (ISSET(iflag, IGNPAR)) {
450 lwkt_reltoken(&tty_token);
453 else if (ISSET(iflag, PARMRK)) {
455 if (tp->t_rawq.c_cc + tp->t_canq.c_cc >
458 clist_putc(0377 | TTY_QUOTE, &tp->t_rawq);
459 clist_putc(0 | TTY_QUOTE, &tp->t_rawq);
460 clist_putc(c | TTY_QUOTE, &tp->t_rawq);
467 if (!ISSET(tp->t_state, TS_TYPEN) && ISSET(iflag, ISTRIP))
469 if (!ISSET(lflag, EXTPROC)) {
471 * Check for literal nexting very first
473 if (ISSET(tp->t_state, TS_LNCH)) {
475 CLR(tp->t_state, TS_LNCH);
478 * Scan for special characters. This code
479 * is really just a big case statement with
480 * non-constant cases. The bottom of the
481 * case statement is labeled ``endcase'', so goto
482 * it after a case match, or similar.
486 * Control chars which aren't controlled
487 * by ICANON, ISIG, or IXON.
489 if (ISSET(lflag, IEXTEN)) {
490 if (CCEQ(cc[VLNEXT], c)) {
491 if (ISSET(lflag, ECHO)) {
492 if (ISSET(lflag, ECHOE)) {
493 (void)ttyoutput('^', tp);
494 (void)ttyoutput('\b', tp);
498 SET(tp->t_state, TS_LNCH);
501 if (CCEQ(cc[VDISCARD], c)) {
502 if (ISSET(lflag, FLUSHO))
503 CLR(tp->t_lflag, FLUSHO);
505 ttyflush(tp, FWRITE);
507 if (tp->t_rawq.c_cc + tp->t_canq.c_cc)
509 SET(tp->t_lflag, FLUSHO);
517 if (ISSET(lflag, ISIG)) {
518 if (CCEQ(cc[VINTR], c) || CCEQ(cc[VQUIT], c)) {
519 if (!ISSET(lflag, NOFLSH))
520 ttyflush(tp, FREAD | FWRITE);
523 CCEQ(cc[VINTR], c) ? SIGINT : SIGQUIT, 1);
526 if (CCEQ(cc[VSUSP], c)) {
527 if (!ISSET(lflag, NOFLSH))
530 pgsignal(tp->t_pgrp, SIGTSTP, 1);
535 * Handle start/stop characters.
537 if (ISSET(iflag, IXON)) {
538 if (CCEQ(cc[VSTOP], c)) {
539 if (!ISSET(tp->t_state, TS_TTSTOP)) {
540 SET(tp->t_state, TS_TTSTOP);
541 (*tp->t_stop)(tp, 0);
542 lwkt_reltoken(&tty_token);
545 if (!CCEQ(cc[VSTART], c)) {
546 lwkt_reltoken(&tty_token);
550 * if VSTART == VSTOP then toggle
554 if (CCEQ(cc[VSTART], c))
558 * IGNCR, ICRNL, & INLCR
561 if (ISSET(iflag, IGNCR)) {
562 lwkt_reltoken(&tty_token);
565 else if (ISSET(iflag, ICRNL))
567 } else if (c == '\n' && ISSET(iflag, INLCR))
570 if (!ISSET(tp->t_lflag, EXTPROC) && ISSET(lflag, ICANON)) {
572 * From here on down canonical mode character
573 * processing takes place.
576 * erase or erase2 (^H / ^?)
578 if (CCEQ(cc[VERASE], c) || CCEQ(cc[VERASE2], c) ) {
580 ttyrub(clist_unputc(&tp->t_rawq), tp);
586 if (CCEQ(cc[VKILL], c)) {
587 if (ISSET(lflag, ECHOKE) &&
588 tp->t_rawq.c_cc == tp->t_rocount &&
589 !ISSET(lflag, ECHOPRT))
590 while (tp->t_rawq.c_cc)
591 ttyrub(clist_unputc(&tp->t_rawq), tp);
594 if (ISSET(lflag, ECHOK) ||
595 ISSET(lflag, ECHOKE))
600 CLR(tp->t_state, TS_LOCAL);
606 if (CCEQ(cc[VWERASE], c) && ISSET(lflag, IEXTEN)) {
612 while ((c = clist_unputc(&tp->t_rawq)) == ' ' || c == '\t')
617 * erase last char of word and remember the
618 * next chars type (for ALTWERASE)
621 c = clist_unputc(&tp->t_rawq);
624 if (c == ' ' || c == '\t') {
625 clist_putc(c, &tp->t_rawq);
634 c = clist_unputc(&tp->t_rawq);
637 } while (c != ' ' && c != '\t' &&
638 (!ISSET(lflag, ALTWERASE) || ISALPHA(c) == ctype));
639 clist_putc(c, &tp->t_rawq);
645 if (CCEQ(cc[VREPRINT], c) && ISSET(lflag, IEXTEN)) {
650 * ^T - kernel info and generate SIGINFO
652 if (CCEQ(cc[VSTATUS], c) && ISSET(lflag, IEXTEN)) {
653 if (ISSET(lflag, ISIG))
654 pgsignal(tp->t_pgrp, SIGINFO, 1);
655 if (!ISSET(lflag, NOKERNINFO))
659 if (CCEQ(cc[VCHECKPT], c) && ISSET(lflag, IEXTEN)) {
660 if (ISSET(lflag, ISIG))
661 pgsignal(tp->t_pgrp, SIGCKPT, 1);
666 * Check for input buffer overflow
668 if (tp->t_rawq.c_cc + tp->t_canq.c_cc >= MAX_INPUT) {
670 if (ISSET(iflag, IMAXBEL)) {
671 if (tp->t_outq.c_cc < tp->t_ohiwat)
672 (void)ttyoutput(CTRL('g'), tp);
677 if ( c == 0377 && ISSET(iflag, PARMRK) && !ISSET(iflag, ISTRIP)
678 && ISSET(iflag, IGNBRK|IGNPAR) != (IGNBRK|IGNPAR))
679 clist_putc(0377 | TTY_QUOTE, &tp->t_rawq);
682 * Put data char in q for user and
683 * wakeup on seeing a line delimiter.
685 if (clist_putc(c, &tp->t_rawq) >= 0) {
686 if (!ISSET(lflag, ICANON)) {
691 if (TTBREAKC(c, lflag)) {
693 catq(&tp->t_rawq, &tp->t_canq);
695 } else if (tp->t_rocount++ == 0)
696 tp->t_rocol = tp->t_column;
697 if (ISSET(tp->t_state, TS_ERASE)) {
699 * end of prterase \.../
701 CLR(tp->t_state, TS_ERASE);
702 (void)ttyoutput('/', tp);
706 if (CCEQ(cc[VEOF], c) && ISSET(lflag, ECHO)) {
708 * Place the cursor over the '^' of the ^D.
710 i = imin(2, tp->t_column - i);
712 (void)ttyoutput('\b', tp);
719 * IXANY means allow any character to restart output.
721 if (ISSET(tp->t_state, TS_TTSTOP) &&
722 !ISSET(iflag, IXANY) && cc[VSTART] != cc[VSTOP]) {
723 lwkt_reltoken(&tty_token);
727 CLR(tp->t_lflag, FLUSHO);
728 CLR(tp->t_state, TS_TTSTOP);
730 lwkt_reltoken(&tty_token);
731 return (ttstart(tp));
735 * Output a single character on a tty, doing output processing
736 * as needed (expanding tabs, newline processing, etc.).
737 * Returns < 0 if succeeds, otherwise returns char to resend.
741 ttyoutput(int c, struct tty *tp)
746 lwkt_gettoken(&tty_token);
748 if (!ISSET(oflag, OPOST)) {
749 if (ISSET(tp->t_lflag, FLUSHO)) {
750 lwkt_reltoken(&tty_token);
753 if (clist_putc(c, &tp->t_outq)) {
754 lwkt_reltoken(&tty_token);
759 lwkt_reltoken(&tty_token);
763 * Do tab expansion if OXTABS is set. Special case if we external
764 * processing, we don't do the tab expansion because we'll probably
765 * get it wrong. If tab expansion needs to be done, let it happen
768 CLR(c, ~TTY_CHARMASK);
770 ISSET(oflag, OXTABS) && !ISSET(tp->t_lflag, EXTPROC)) {
771 c = 8 - (tp->t_column & 7);
772 if (!ISSET(tp->t_lflag, FLUSHO)) {
773 crit_enter(); /* Don't interrupt tabs. */
774 c -= b_to_q(" ", c, &tp->t_outq);
780 lwkt_reltoken(&tty_token);
781 return (c ? -1 : '\t');
783 if (c == CEOT && ISSET(oflag, ONOEOT)) {
784 lwkt_reltoken(&tty_token);
789 * Newline translation: if ONLCR is set,
790 * translate newline into "\r\n".
792 if (c == '\n' && ISSET(tp->t_oflag, ONLCR)) {
795 if (!ISSET(tp->t_lflag, FLUSHO) && clist_putc('\r', &tp->t_outq)) {
796 lwkt_reltoken(&tty_token);
800 /* If OCRNL is set, translate "\r" into "\n". */
801 else if (c == '\r' && ISSET(tp->t_oflag, OCRNL))
803 /* If ONOCR is set, don't transmit CRs when on column 0. */
804 else if (c == '\r' && ISSET(tp->t_oflag, ONOCR) && tp->t_column == 0) {
805 lwkt_reltoken(&tty_token);
811 if (!ISSET(tp->t_lflag, FLUSHO) && clist_putc(c, &tp->t_outq)) {
812 lwkt_reltoken(&tty_token);
825 if (ISSET(tp->t_oflag, ONLCR | ONLRET))
835 col = (col + 8) & ~7;
839 lwkt_reltoken(&tty_token);
844 * Ioctls for all tty devices. Called after line-discipline specific ioctl
845 * has been called to do discipline-specific functions and/or reject any
846 * of these ioctl commands.
850 ttioctl(struct tty *tp, u_long cmd, void *data, int flag)
852 struct thread *td = curthread;
853 struct lwp *lp = td->td_lwp;
854 struct proc *p = td->td_proc;
860 lwkt_gettoken(&tty_token);
861 lwkt_gettoken(&proc_token);
863 /* If the ioctl involves modification, hang if in the background. */
887 #if defined(COMPAT_43) || defined(COMPAT_SUNOS)
897 while (isbackground(p, tp) && !(p->p_flag & P_PPWAIT) &&
898 !SIGISMEMBER(p->p_sigignore, SIGTTOU) &&
899 !SIGISMEMBER(lp->lwp_sigmask, SIGTTOU)) {
900 if (p->p_pgrp->pg_jobc == 0) {
901 lwkt_reltoken(&proc_token);
902 lwkt_reltoken(&tty_token);
905 pgsignal(p->p_pgrp, SIGTTOU, 1);
906 error = ttysleep(tp, &lbolt, PCATCH, "ttybg1",
909 lwkt_reltoken(&proc_token);
910 lwkt_reltoken(&tty_token);
917 switch (cmd) { /* Process the ioctl. */
918 case FIOASYNC: /* set/clear async i/o */
921 SET(tp->t_state, TS_ASYNC);
923 CLR(tp->t_state, TS_ASYNC);
926 case FIONREAD: /* get # bytes to read */
928 *(int *)data = ttnread(tp);
934 * Policy -- Don't allow FIOSETOWN on someone else's
937 if (tp->t_session != NULL && !isctty(p, tp)) {
938 lwkt_reltoken(&proc_token);
939 lwkt_reltoken(&tty_token);
943 error = fsetown(*(int *)data, &tp->t_sigio);
945 lwkt_reltoken(&proc_token);
946 lwkt_reltoken(&tty_token);
951 if (tp->t_session != NULL && !isctty(p, tp)) {
952 lwkt_reltoken(&proc_token);
953 lwkt_reltoken(&tty_token);
956 *(int *)data = fgetown(&tp->t_sigio);
959 case TIOCEXCL: /* set exclusive use of tty */
961 SET(tp->t_state, TS_XCLUDE);
964 case TIOCFLUSH: { /* flush buffers */
965 int flags = *(int *)data;
968 flags = FREAD | FWRITE;
970 flags &= FREAD | FWRITE;
974 case TIOCCONS: /* become virtual console */
976 if (constty && constty != tp &&
977 ISSET(constty->t_state, TS_CONNECTED)) {
978 lwkt_reltoken(&proc_token);
979 lwkt_reltoken(&tty_token);
983 if ((error = priv_check(td, PRIV_ROOT)) != 0) {
984 lwkt_reltoken(&proc_token);
985 lwkt_reltoken(&tty_token);
990 } else if (tp == constty)
993 case TIOCDRAIN: /* wait till output drained */
996 lwkt_reltoken(&proc_token);
997 lwkt_reltoken(&tty_token);
1001 case TIOCGETA: { /* get termios struct */
1002 struct termios *t = (struct termios *)data;
1004 bcopy(&tp->t_termios, t, sizeof(struct termios));
1007 case TIOCGETD: /* get line discipline */
1008 *(int *)data = tp->t_line;
1010 case TIOCGWINSZ: /* get window size */
1011 *(struct winsize *)data = tp->t_winsize;
1013 case TIOCGPGRP: /* get pgrp of tty */
1014 if (!isctty(p, tp)) {
1015 lwkt_reltoken(&proc_token);
1016 lwkt_reltoken(&tty_token);
1019 *(int *)data = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PID;
1021 case TIOCGSID: /* get sid of tty */
1022 if (!isctty(p, tp)) {
1023 lwkt_reltoken(&proc_token);
1024 lwkt_reltoken(&tty_token);
1027 *(int *)data = tp->t_session->s_sid;
1030 case TIOCHPCL: /* hang up on last close */
1032 SET(tp->t_cflag, HUPCL);
1036 case TIOCNXCL: /* reset exclusive use of tty */
1038 CLR(tp->t_state, TS_XCLUDE);
1041 case TIOCOUTQ: /* output queue size */
1042 *(int *)data = tp->t_outq.c_cc;
1044 case TIOCSETA: /* set termios struct */
1045 case TIOCSETAW: /* drain output, set */
1046 case TIOCSETAF: { /* drn out, fls in, set */
1047 struct termios *t = (struct termios *)data;
1049 if (t->c_ispeed == 0)
1050 t->c_ispeed = t->c_ospeed;
1051 if (t->c_ispeed == 0)
1052 t->c_ispeed = tp->t_ospeed;
1053 if (t->c_ispeed == 0) {
1054 lwkt_reltoken(&proc_token);
1055 lwkt_reltoken(&tty_token);
1059 if (cmd == TIOCSETAW || cmd == TIOCSETAF) {
1060 error = ttywait(tp);
1063 lwkt_reltoken(&proc_token);
1064 lwkt_reltoken(&tty_token);
1067 if (cmd == TIOCSETAF)
1068 ttyflush(tp, FREAD);
1070 if (!ISSET(t->c_cflag, CIGNORE)) {
1072 * Set device hardware.
1074 if (tp->t_param && (error = (*tp->t_param)(tp, t))) {
1076 lwkt_reltoken(&proc_token);
1077 lwkt_reltoken(&tty_token);
1080 if (ISSET(t->c_cflag, CLOCAL) &&
1081 !ISSET(tp->t_cflag, CLOCAL)) {
1083 * XXX disconnections would be too hard to
1084 * get rid of without this kludge. The only
1085 * way to get rid of controlling terminals
1086 * is to exit from the session leader.
1088 CLR(tp->t_state, TS_ZOMBIE);
1090 wakeup(TSA_CARR_ON(tp));
1094 if ((ISSET(tp->t_state, TS_CARR_ON) ||
1095 ISSET(t->c_cflag, CLOCAL)) &&
1096 !ISSET(tp->t_state, TS_ZOMBIE))
1097 SET(tp->t_state, TS_CONNECTED);
1099 CLR(tp->t_state, TS_CONNECTED);
1100 tp->t_cflag = t->c_cflag;
1101 tp->t_ispeed = t->c_ispeed;
1102 if (t->c_ospeed != 0)
1103 tp->t_ospeed = t->c_ospeed;
1106 if (ISSET(t->c_lflag, ICANON) != ISSET(tp->t_lflag, ICANON) &&
1108 if (ISSET(t->c_lflag, ICANON))
1109 SET(tp->t_lflag, PENDIN);
1112 * XXX we really shouldn't allow toggling
1113 * ICANON while we're in a non-termios line
1114 * discipline. Now we have to worry about
1115 * panicing for a null queue.
1117 if (tp->t_canq.c_cbreserved > 0 &&
1118 tp->t_rawq.c_cbreserved > 0) {
1119 catq(&tp->t_rawq, &tp->t_canq);
1121 * XXX the queue limits may be
1122 * different, so the old queue
1123 * swapping method no longer works.
1125 catq(&tp->t_canq, &tp->t_rawq);
1127 CLR(tp->t_lflag, PENDIN);
1131 tp->t_iflag = t->c_iflag;
1132 tp->t_oflag = t->c_oflag;
1134 * Make the EXTPROC bit read only.
1136 if (ISSET(tp->t_lflag, EXTPROC))
1137 SET(t->c_lflag, EXTPROC);
1139 CLR(t->c_lflag, EXTPROC);
1140 tp->t_lflag = t->c_lflag | ISSET(tp->t_lflag, PENDIN);
1141 if (t->c_cc[VMIN] != tp->t_cc[VMIN] ||
1142 t->c_cc[VTIME] != tp->t_cc[VTIME])
1144 bcopy(t->c_cc, tp->t_cc, sizeof(t->c_cc));
1148 case TIOCSETD: { /* set line discipline */
1149 int t = *(int *)data;
1150 cdev_t device = tp->t_dev;
1152 if ((u_int)t >= nlinesw) {
1153 lwkt_reltoken(&proc_token);
1154 lwkt_reltoken(&tty_token);
1157 if (t != tp->t_line) {
1159 (*linesw[tp->t_line].l_close)(tp, flag);
1160 error = (*linesw[t].l_open)(device, tp);
1162 (void)(*linesw[tp->t_line].l_open)(device, tp);
1164 lwkt_reltoken(&proc_token);
1165 lwkt_reltoken(&tty_token);
1173 case TIOCSTART: /* start output, like ^Q */
1175 if (ISSET(tp->t_state, TS_TTSTOP) ||
1176 ISSET(tp->t_lflag, FLUSHO)) {
1177 CLR(tp->t_lflag, FLUSHO);
1178 CLR(tp->t_state, TS_TTSTOP);
1183 case TIOCSTI: /* simulate terminal input */
1184 if ((flag & FREAD) == 0 && priv_check(td, PRIV_ROOT)) {
1185 lwkt_reltoken(&proc_token);
1186 lwkt_reltoken(&tty_token);
1189 if (!isctty(p, tp) && priv_check(td, PRIV_ROOT)) {
1190 lwkt_reltoken(&proc_token);
1191 lwkt_reltoken(&tty_token);
1195 (*linesw[tp->t_line].l_rint)(*(u_char *)data, tp);
1198 case TIOCSTOP: /* stop output, like ^S */
1200 if (!ISSET(tp->t_state, TS_TTSTOP)) {
1201 SET(tp->t_state, TS_TTSTOP);
1202 (*tp->t_stop)(tp, 0);
1206 case TIOCSCTTY: /* become controlling tty */
1207 /* Session ctty vnode pointer set in vnode layer. */
1208 if (!SESS_LEADER(p) ||
1209 ((p->p_session->s_ttyvp || tp->t_session) &&
1210 (tp->t_session != p->p_session))) {
1211 lwkt_reltoken(&proc_token);
1212 lwkt_reltoken(&tty_token);
1216 tp->t_session = p->p_session;
1219 tp->t_pgrp = p->p_pgrp;
1220 otp = p->p_session->s_ttyp;
1221 p->p_session->s_ttyp = tp;
1222 p->p_flag |= P_CONTROLT;
1230 case TIOCSPGRP: { /* set pgrp of tty */
1231 pid_t pgid = *(int *)data;
1233 if (!isctty(p, tp)) {
1234 lwkt_reltoken(&proc_token);
1235 lwkt_reltoken(&tty_token);
1238 else if (pgid < 1 || pgid > PID_MAX) {
1239 lwkt_reltoken(&proc_token);
1240 lwkt_reltoken(&tty_token);
1243 struct pgrp *pgrp = pgfind(pgid);
1244 if (pgrp == NULL || pgrp->pg_session != p->p_session) {
1247 lwkt_reltoken(&proc_token);
1248 lwkt_reltoken(&tty_token);
1260 case TIOCSTAT: /* simulate control-T */
1265 case TIOCSWINSZ: /* set window size */
1266 if (bcmp((caddr_t)&tp->t_winsize, data,
1267 sizeof (struct winsize))) {
1268 tp->t_winsize = *(struct winsize *)data;
1269 pgsignal(tp->t_pgrp, SIGWINCH, 1);
1272 case TIOCSDRAINWAIT:
1273 error = priv_check(td, PRIV_ROOT);
1275 lwkt_reltoken(&proc_token);
1276 lwkt_reltoken(&tty_token);
1279 tp->t_timeout = *(int *)data * hz;
1280 wakeup(TSA_OCOMPLETE(tp));
1281 wakeup(TSA_OLOWAT(tp));
1283 case TIOCGDRAINWAIT:
1284 *(int *)data = tp->t_timeout / hz;
1287 #if defined(COMPAT_43) || defined(COMPAT_SUNOS)
1288 lwkt_reltoken(&proc_token);
1289 lwkt_reltoken(&tty_token);
1290 return (ttcompat(tp, cmd, data, flag));
1292 lwkt_reltoken(&proc_token);
1293 lwkt_reltoken(&tty_token);
1297 lwkt_reltoken(&proc_token);
1298 lwkt_reltoken(&tty_token);
1302 static struct filterops ttyread_filtops =
1303 { FILTEROP_ISFD|FILTEROP_MPSAFE, NULL, filt_ttyrdetach, filt_ttyread };
1304 static struct filterops ttywrite_filtops =
1305 { FILTEROP_ISFD|FILTEROP_MPSAFE, NULL, filt_ttywdetach, filt_ttywrite };
1308 ttykqfilter(struct dev_kqfilter_args *ap)
1310 cdev_t dev = ap->a_head.a_dev;
1311 struct knote *kn = ap->a_kn;
1312 struct tty *tp = dev->si_tty;
1313 struct klist *klist;
1317 lwkt_gettoken(&tty_token);
1318 switch (kn->kn_filter) {
1320 klist = &tp->t_rkq.ki_note;
1321 kn->kn_fop = &ttyread_filtops;
1324 klist = &tp->t_wkq.ki_note;
1325 kn->kn_fop = &ttywrite_filtops;
1328 ap->a_result = EOPNOTSUPP;
1329 lwkt_reltoken(&tty_token);
1332 lwkt_reltoken(&tty_token);
1333 kn->kn_hook = (caddr_t)dev;
1334 knote_insert(klist, kn);
1340 filt_ttyrdetach(struct knote *kn)
1342 struct tty *tp = ((cdev_t)kn->kn_hook)->si_tty;
1344 lwkt_gettoken(&tty_token);
1345 knote_remove(&tp->t_rkq.ki_note, kn);
1346 lwkt_reltoken(&tty_token);
1350 filt_ttyread(struct knote *kn, long hint)
1352 struct tty *tp = ((cdev_t)kn->kn_hook)->si_tty;
1354 lwkt_gettoken(&tty_token);
1355 kn->kn_data = ttnread(tp);
1356 if (ISSET(tp->t_state, TS_ZOMBIE)) {
1357 kn->kn_flags |= (EV_EOF | EV_NODATA);
1358 lwkt_reltoken(&tty_token);
1361 lwkt_reltoken(&tty_token);
1362 return (kn->kn_data > 0);
1366 filt_ttywdetach(struct knote *kn)
1368 struct tty *tp = ((cdev_t)kn->kn_hook)->si_tty;
1370 lwkt_gettoken(&tty_token);
1371 knote_remove(&tp->t_wkq.ki_note, kn);
1372 lwkt_reltoken(&tty_token);
1376 filt_ttywrite(struct knote *kn, long hint)
1378 struct tty *tp = ((cdev_t)kn->kn_hook)->si_tty;
1381 lwkt_gettoken(&tty_token);
1382 kn->kn_data = tp->t_outq.c_cc;
1383 if (ISSET(tp->t_state, TS_ZOMBIE)) {
1384 lwkt_reltoken(&tty_token);
1387 ret = (kn->kn_data <= tp->t_olowat &&
1388 ISSET(tp->t_state, TS_CONNECTED));
1389 lwkt_reltoken(&tty_token);
1394 * Must be called while in a critical section.
1395 * NOTE: tty_token must be held.
1398 ttnread(struct tty *tp)
1402 ASSERT_LWKT_TOKEN_HELD(&tty_token);
1403 if (ISSET(tp->t_lflag, PENDIN))
1405 nread = tp->t_canq.c_cc;
1406 if (!ISSET(tp->t_lflag, ICANON)) {
1407 nread += tp->t_rawq.c_cc;
1408 if (nread < tp->t_cc[VMIN] && tp->t_cc[VTIME] == 0)
1415 * Wait for output to drain.
1418 ttywait(struct tty *tp)
1424 lwkt_gettoken(&tty_token);
1425 while ((tp->t_outq.c_cc || ISSET(tp->t_state, TS_BUSY)) &&
1426 ISSET(tp->t_state, TS_CONNECTED) && tp->t_oproc) {
1428 if ((tp->t_outq.c_cc || ISSET(tp->t_state, TS_BUSY)) &&
1429 ISSET(tp->t_state, TS_CONNECTED)) {
1430 SET(tp->t_state, TS_SO_OCOMPLETE);
1431 error = ttysleep(tp, TSA_OCOMPLETE(tp),
1435 if (error == EWOULDBLOCK)
1442 if (!error && (tp->t_outq.c_cc || ISSET(tp->t_state, TS_BUSY)))
1444 lwkt_reltoken(&tty_token);
1450 * Flush if successfully wait.
1453 ttywflush(struct tty *tp)
1457 if ((error = ttywait(tp)) == 0)
1458 ttyflush(tp, FREAD);
1463 * Flush tty read and/or write queues, notifying anyone waiting.
1466 ttyflush(struct tty *tp, int rw)
1469 lwkt_gettoken(&tty_token);
1474 FLUSHQ(&tp->t_outq);
1475 CLR(tp->t_state, TS_TTSTOP);
1477 (*tp->t_stop)(tp, rw);
1479 FLUSHQ(&tp->t_canq);
1480 FLUSHQ(&tp->t_rawq);
1481 CLR(tp->t_lflag, PENDIN);
1484 CLR(tp->t_state, TS_LOCAL);
1486 if (ISSET(tp->t_state, TS_TBLOCK)) {
1488 FLUSHQ(&tp->t_outq);
1492 * Don't let leave any state that might clobber the
1493 * next line discipline (although we should do more
1494 * to send the START char). Not clearing the state
1495 * may have caused the "putc to a clist with no
1496 * reserved cblocks" panic/kprintf.
1498 CLR(tp->t_state, TS_TBLOCK);
1500 #if 0 /* forget it, sleeping isn't always safe and we don't know when it is */
1501 if (ISSET(tp->t_iflag, IXOFF)) {
1503 * XXX wait a bit in the hope that the stop
1504 * character (if any) will go out. Waiting
1505 * isn't good since it allows races. This
1506 * will be fixed when the stop character is
1507 * put in a special queue. Don't bother with
1508 * the checks in ttywait() since the timeout
1511 SET(tp->t_state, TS_SO_OCOMPLETE);
1512 ttysleep(tp, TSA_OCOMPLETE(tp), 0,
1515 * Don't try sending the stop character again.
1517 CLR(tp->t_state, TS_TBLOCK);
1524 FLUSHQ(&tp->t_outq);
1527 lwkt_reltoken(&tty_token);
1532 * Copy in the default termios characters.
1535 termioschars(struct termios *t)
1537 lwkt_gettoken(&tty_token);
1538 bcopy(ttydefchars, t->c_cc, sizeof t->c_cc);
1539 lwkt_reltoken(&tty_token);
1546 ttychars(struct tty *tp)
1548 lwkt_gettoken(&tty_token);
1549 termioschars(&tp->t_termios);
1550 lwkt_reltoken(&tty_token);
1554 * Handle input high water. Send stop character for the IXOFF case. Turn
1555 * on our input flow control bit and propagate the changes to the driver.
1556 * XXX the stop character should be put in a special high priority queue.
1559 ttyblock(struct tty *tp)
1561 lwkt_gettoken(&tty_token);
1562 SET(tp->t_state, TS_TBLOCK);
1563 if (ISSET(tp->t_iflag, IXOFF) && tp->t_cc[VSTOP] != _POSIX_VDISABLE &&
1564 clist_putc(tp->t_cc[VSTOP], &tp->t_outq) != 0)
1565 CLR(tp->t_state, TS_TBLOCK); /* try again later */
1567 lwkt_reltoken(&tty_token);
1571 * Handle input low water. Send start character for the IXOFF case. Turn
1572 * off our input flow control bit and propagate the changes to the driver.
1573 * XXX the start character should be put in a special high priority queue.
1576 ttyunblock(struct tty *tp)
1578 lwkt_gettoken(&tty_token);
1579 CLR(tp->t_state, TS_TBLOCK);
1580 if (ISSET(tp->t_iflag, IXOFF) && tp->t_cc[VSTART] != _POSIX_VDISABLE &&
1581 clist_putc(tp->t_cc[VSTART], &tp->t_outq) != 0)
1582 SET(tp->t_state, TS_TBLOCK); /* try again later */
1584 lwkt_reltoken(&tty_token);
1588 /* Not used by any current (i386) drivers. */
1590 * Restart after an inter-char delay.
1593 ttrstrt(void *tp_arg)
1597 KASSERT(tp_arg != NULL, ("ttrstrt"));
1601 lwkt_gettoken(&tty_token);
1602 CLR(tp->t_state, TS_TIMEOUT);
1604 lwkt_reltoken(&tty_token);
1610 ttstart(struct tty *tp)
1612 lwkt_gettoken(&tty_token);
1613 if (tp->t_oproc != NULL) /* XXX: Kludge for pty. */
1615 lwkt_reltoken(&tty_token);
1620 * "close" a line discipline
1623 ttylclose(struct tty *tp, int flag)
1625 lwkt_gettoken(&tty_token);
1626 if (flag & FNONBLOCK || ttywflush(tp))
1627 ttyflush(tp, FREAD | FWRITE);
1628 lwkt_reltoken(&tty_token);
1633 ttyhold(struct tty *tp)
1639 ttyunhold(struct tty *tp)
1648 * Handle modem control transition on a tty.
1649 * Flag indicates new state of carrier.
1650 * Returns 0 if the line should be turned off, otherwise 1.
1653 ttymodem(struct tty *tp, int flag)
1655 lwkt_gettoken(&tty_token);
1656 if (ISSET(tp->t_state, TS_CARR_ON) && ISSET(tp->t_cflag, MDMBUF)) {
1658 * MDMBUF: do flow control according to carrier flag
1659 * XXX TS_CAR_OFLOW doesn't do anything yet. TS_TTSTOP
1660 * works if IXON and IXANY are clear.
1663 CLR(tp->t_state, TS_CAR_OFLOW);
1664 CLR(tp->t_state, TS_TTSTOP);
1666 } else if (!ISSET(tp->t_state, TS_CAR_OFLOW)) {
1667 SET(tp->t_state, TS_CAR_OFLOW);
1668 SET(tp->t_state, TS_TTSTOP);
1669 (*tp->t_stop)(tp, 0);
1671 } else if (flag == 0) {
1675 CLR(tp->t_state, TS_CARR_ON);
1676 if (ISSET(tp->t_state, TS_ISOPEN) &&
1677 !ISSET(tp->t_cflag, CLOCAL)) {
1678 SET(tp->t_state, TS_ZOMBIE);
1679 CLR(tp->t_state, TS_CONNECTED);
1680 if (tp->t_session && tp->t_session->s_leader)
1681 ksignal(tp->t_session->s_leader, SIGHUP);
1682 ttyflush(tp, FREAD | FWRITE);
1683 lwkt_reltoken(&tty_token);
1690 SET(tp->t_state, TS_CARR_ON);
1691 if (!ISSET(tp->t_state, TS_ZOMBIE))
1692 SET(tp->t_state, TS_CONNECTED);
1693 wakeup(TSA_CARR_ON(tp));
1697 lwkt_reltoken(&tty_token);
1702 * Reinput pending characters after state switch
1703 * call from a critical section.
1706 ttypend(struct tty *tp)
1711 lwkt_gettoken(&tty_token);
1712 CLR(tp->t_lflag, PENDIN);
1713 SET(tp->t_state, TS_TYPEN);
1715 * XXX this assumes too much about clist internals. It may even
1716 * fail if the cblock slush pool is empty. We can't allocate more
1717 * cblocks here because we are called from an interrupt handler
1718 * and clist_alloc_cblocks() can wait.
1721 bzero(&tp->t_rawq, sizeof tp->t_rawq);
1722 tp->t_rawq.c_cbmax = tq.c_cbmax;
1723 tp->t_rawq.c_cbreserved = tq.c_cbreserved;
1724 while ((c = clist_getc(&tq)) >= 0)
1726 CLR(tp->t_state, TS_TYPEN);
1727 lwkt_reltoken(&tty_token);
1731 * Process a read call on a tty device.
1734 ttread(struct tty *tp, struct uio *uio, int flag)
1739 cc_t *cc = tp->t_cc;
1742 int first, error = 0;
1743 int has_stime = 0, last_cc = 0;
1744 long slp = 0; /* XXX this should be renamed `timo'. */
1745 struct timeval stime;
1747 lp = curthread->td_lwp;
1748 stime.tv_sec = 0; /* fix compiler warnings */
1751 lwkt_gettoken(&tty_token);
1754 lflag = tp->t_lflag;
1756 * take pending input first
1758 if (ISSET(lflag, PENDIN)) {
1760 splz(); /* reduce latency */
1761 lflag = tp->t_lflag; /* XXX ttypend() clobbers it */
1765 * Hang process if it's in the background.
1767 lwkt_gettoken(&proc_token);
1768 if ((pp = curproc) && isbackground(pp, tp)) {
1770 if (SIGISMEMBER(pp->p_sigignore, SIGTTIN) ||
1771 SIGISMEMBER(lp->lwp_sigmask, SIGTTIN) ||
1772 (pp->p_flag & P_PPWAIT) || pp->p_pgrp->pg_jobc == 0) {
1773 lwkt_reltoken(&proc_token);
1774 lwkt_reltoken(&tty_token);
1777 pgsignal(pp->p_pgrp, SIGTTIN, 1);
1778 error = ttysleep(tp, &lbolt, PCATCH, "ttybg2", 0);
1780 lwkt_reltoken(&proc_token);
1781 lwkt_reltoken(&tty_token);
1784 lwkt_reltoken(&proc_token);
1787 lwkt_reltoken(&proc_token);
1789 if (ISSET(tp->t_state, TS_ZOMBIE)) {
1791 lwkt_reltoken(&tty_token);
1792 return (0); /* EOF */
1796 * If canonical, use the canonical queue,
1797 * else use the raw queue.
1799 * (should get rid of clists...)
1801 qp = ISSET(lflag, ICANON) ? &tp->t_canq : &tp->t_rawq;
1803 if (flag & IO_NDELAY) {
1806 if (!ISSET(lflag, ICANON) && cc[VMIN] == 0) {
1808 lwkt_reltoken(&tty_token);
1812 lwkt_reltoken(&tty_token);
1813 return (EWOULDBLOCK);
1815 if (!ISSET(lflag, ICANON)) {
1818 struct timeval timecopy;
1821 * Check each of the four combinations.
1822 * (m > 0 && t == 0) is the normal read case.
1823 * It should be fairly efficient, so we check that and its
1824 * companion case (m == 0 && t == 0) first.
1825 * For the other two cases, we compute the target sleep time
1834 /* m, t and qp->c_cc are all 0. 0 is enough input. */
1836 lwkt_reltoken(&tty_token);
1839 t *= 100000; /* time in us */
1840 #define diff(t1, t2) (((t1).tv_sec - (t2).tv_sec) * 1000000 + \
1841 ((t1).tv_usec - (t2).tv_usec))
1847 getmicrotime(&timecopy);
1848 if (has_stime == 0) {
1849 /* first character, start timer */
1853 } else if (qp->c_cc > last_cc) {
1854 /* got a character, restart timer */
1858 /* nothing, check expiration */
1859 slp = t - diff(timecopy, stime);
1864 } else { /* m == 0 */
1867 getmicrotime(&timecopy);
1868 if (has_stime == 0) {
1873 slp = t - diff(timecopy, stime);
1875 /* Timed out, but 0 is enough input. */
1877 lwkt_reltoken(&tty_token);
1884 * Rounding down may make us wake up just short
1885 * of the target, so we round up.
1886 * The formula is ceiling(slp * hz/1000000).
1887 * 32-bit arithmetic is enough for hz < 169.
1888 * XXX see tvtohz() for how to avoid overflow if hz
1889 * is large (divide by `tick' and/or arrange to
1890 * use tvtohz() if hz is large).
1892 slp = (long) (((u_long)slp * hz) + 999999) / 1000000;
1895 if (qp->c_cc <= 0) {
1898 * There is no input, or not enough input and we can block.
1900 error = ttysleep(tp, TSA_HUP_OR_INPUT(tp), PCATCH,
1901 ISSET(tp->t_state, TS_CONNECTED) ?
1902 "ttyin" : "ttyhup", (int)slp);
1904 if (error == EWOULDBLOCK)
1907 lwkt_reltoken(&tty_token);
1911 * XXX what happens if another process eats some input
1912 * while we are asleep (not just here)? It would be
1913 * safest to detect changes and reset our state variables
1914 * (has_stime and last_cc).
1922 * Input present, check for input mapping and processing.
1925 if (ISSET(lflag, ICANON | ISIG))
1931 icc = (int)szmin(uio->uio_resid, IBUFSIZ);
1932 icc = q_to_b(qp, ibuf, icc);
1938 error = uiomove(ibuf, (size_t)icc, uio);
1940 * XXX if there was an error then we should ungetc() the
1941 * unmoved chars and reduce icc here.
1945 if (uio->uio_resid == 0)
1959 * delayed suspend (^Y)
1961 if (CCEQ(cc[VDSUSP], c) &&
1962 ISSET(lflag, IEXTEN | ISIG) == (IEXTEN | ISIG)) {
1963 pgsignal(tp->t_pgrp, SIGTSTP, 1);
1965 error = ttysleep(tp, &lbolt, PCATCH,
1974 * Interpret EOF only in canonical mode.
1976 if (CCEQ(cc[VEOF], c) && ISSET(lflag, ICANON))
1979 * Give user character.
1981 error = ureadc(c, uio);
1983 /* XXX should ungetc(c, qp). */
1985 if (uio->uio_resid == 0)
1988 * In canonical mode check for a "break character"
1989 * marking the end of a "line of input".
1991 if (ISSET(lflag, ICANON) && TTBREAKC(c, lflag))
1998 * Look to unblock input now that (presumably)
1999 * the input queue has gone down.
2002 if (ISSET(tp->t_state, TS_TBLOCK) &&
2003 tp->t_rawq.c_cc + tp->t_canq.c_cc <= tp->t_ilowat)
2007 lwkt_reltoken(&tty_token);
2012 * Check the output queue on tp for space for a kernel message (from uprintf
2013 * or tprintf). Allow some space over the normal hiwater mark so we don't
2014 * lose messages due to normal flow control, but don't let the tty run amok.
2015 * Sleeps here are not interruptible, but we return prematurely if new signals
2019 ttycheckoutq(struct tty *tp, int wait)
2021 struct lwp *lp = curthread->td_lwp;
2023 sigset_t oldset, newset;
2025 lwkt_gettoken(&tty_token);
2026 hiwat = tp->t_ohiwat;
2027 SIGEMPTYSET(oldset);
2028 SIGEMPTYSET(newset);
2031 oldset = lwp_sigpend(lp);
2032 if (tp->t_outq.c_cc > hiwat + OBUFSIZ + 100) {
2033 while (tp->t_outq.c_cc > hiwat) {
2035 if (tp->t_outq.c_cc <= hiwat)
2038 newset = lwp_sigpend(lp);
2039 if (!wait || SIGSETNEQ(oldset, newset)) {
2041 lwkt_reltoken(&tty_token);
2044 SET(tp->t_state, TS_SO_OLOWAT);
2045 tsleep(TSA_OLOWAT(tp), 0, "ttoutq", hz);
2049 lwkt_reltoken(&tty_token);
2054 * Process a write call on a tty device.
2057 ttwrite(struct tty *tp, struct uio *uio, int flag)
2063 int i, hiwat, error;
2068 lwkt_gettoken(&tty_token);
2069 lp = curthread->td_lwp;
2070 hiwat = tp->t_ohiwat;
2071 cnt = uio->uio_resid;
2076 if (ISSET(tp->t_state, TS_ZOMBIE)) {
2078 if (uio->uio_resid == cnt)
2082 if (!ISSET(tp->t_state, TS_CONNECTED)) {
2083 if (flag & IO_NDELAY) {
2085 error = EWOULDBLOCK;
2088 error = ttysleep(tp, TSA_CARR_ON(tp), PCATCH, "ttydcd", 0);
2097 * Hang the process if it's in the background.
2099 lwkt_gettoken(&proc_token);
2100 if ((pp = curproc) && isbackground(pp, tp) &&
2101 ISSET(tp->t_lflag, TOSTOP) && !(pp->p_flag & P_PPWAIT) &&
2102 !SIGISMEMBER(pp->p_sigignore, SIGTTOU) &&
2103 !SIGISMEMBER(lp->lwp_sigmask, SIGTTOU)) {
2104 if (pp->p_pgrp->pg_jobc == 0) {
2106 lwkt_reltoken(&proc_token);
2109 pgsignal(pp->p_pgrp, SIGTTOU, 1);
2110 lwkt_reltoken(&proc_token);
2111 error = ttysleep(tp, &lbolt, PCATCH, "ttybg4", 0);
2116 lwkt_reltoken(&proc_token);
2118 * Process the user's data in at most OBUFSIZ chunks. Perform any
2119 * output translation. Keep track of high water mark, sleep on
2120 * overflow awaiting device aid in acquiring new space.
2122 while (uio->uio_resid > 0 || cc > 0) {
2123 if (ISSET(tp->t_lflag, FLUSHO)) {
2125 lwkt_reltoken(&tty_token);
2128 if (tp->t_outq.c_cc > hiwat)
2131 * Grab a hunk of data from the user, unless we have some
2132 * leftover from last time.
2135 cc = szmin(uio->uio_resid, OBUFSIZ);
2137 error = uiomove(cp, (size_t)cc, uio);
2144 * If nothing fancy need be done, grab those characters we
2145 * can handle without any of ttyoutput's processing and
2146 * just transfer them to the output q. For those chars
2147 * which require special processing (as indicated by the
2148 * bits in char_type), call ttyoutput. After processing
2149 * a hunk of data, look for FLUSHO so ^O's will take effect
2153 if (!ISSET(tp->t_oflag, OPOST))
2156 ce = cc - scanc((u_int)cc, (u_char *)cp,
2157 char_type, CCLASSMASK);
2159 * If ce is zero, then we're processing
2160 * a special character through ttyoutput.
2164 if (ttyoutput(*cp, tp) >= 0) {
2165 /* No Clists, wait a bit. */
2167 if (flag & IO_NDELAY) {
2168 error = EWOULDBLOCK;
2171 error = ttysleep(tp, &lbolt,
2180 if (ISSET(tp->t_lflag, FLUSHO) ||
2181 tp->t_outq.c_cc > hiwat)
2187 * A bunch of normal characters have been found.
2188 * Transfer them en masse to the output queue and
2189 * continue processing at the top of the loop.
2190 * If there are any further characters in this
2191 * <= OBUFSIZ chunk, the first should be a character
2192 * requiring special handling by ttyoutput.
2195 i = b_to_q(cp, ce, &tp->t_outq);
2198 cp += ce, cc -= ce, tk_nout += ce;
2201 /* No Clists, wait a bit. */
2203 if (flag & IO_NDELAY) {
2204 error = EWOULDBLOCK;
2207 error = ttysleep(tp, &lbolt, PCATCH,
2213 if (ISSET(tp->t_lflag, FLUSHO) ||
2214 tp->t_outq.c_cc > hiwat)
2221 * If cc is nonzero, we leave the uio structure inconsistent, as the
2222 * offset and iov pointers have moved forward, but it doesn't matter
2223 * (the call will either return short or restart with a new uio).
2225 uio->uio_resid += cc;
2226 lwkt_reltoken(&tty_token);
2233 * This can only occur if FLUSHO is set in t_lflag,
2234 * or if ttstart/oproc is synchronous (or very fast).
2236 if (tp->t_outq.c_cc <= hiwat) {
2240 if (flag & IO_NDELAY) {
2242 uio->uio_resid += cc;
2243 lwkt_reltoken(&tty_token);
2244 return (uio->uio_resid == cnt ? EWOULDBLOCK : 0);
2246 SET(tp->t_state, TS_SO_OLOWAT);
2247 error = ttysleep(tp, TSA_OLOWAT(tp), PCATCH, "ttywri", tp->t_timeout);
2249 if (error == EWOULDBLOCK)
2257 * Rubout one character from the rawq of tp
2258 * as cleanly as possible.
2259 * NOTE: Must be called with tty_token held
2262 ttyrub(int c, struct tty *tp)
2268 ASSERT_LWKT_TOKEN_HELD(&tty_token);
2269 if (!ISSET(tp->t_lflag, ECHO) || ISSET(tp->t_lflag, EXTPROC))
2271 CLR(tp->t_lflag, FLUSHO);
2272 if (ISSET(tp->t_lflag, ECHOE)) {
2273 if (tp->t_rocount == 0) {
2275 * Screwed by ttwrite; retype
2280 if (c == ('\t' | TTY_QUOTE) || c == ('\n' | TTY_QUOTE))
2283 CLR(c, ~TTY_CHARMASK);
2284 switch (CCLASS(c)) {
2293 if (ISSET(tp->t_lflag, ECHOCTL))
2297 if (tp->t_rocount < tp->t_rawq.c_cc) {
2302 savecol = tp->t_column;
2303 SET(tp->t_state, TS_CNTTB);
2304 SET(tp->t_lflag, FLUSHO);
2305 tp->t_column = tp->t_rocol;
2306 cp = tp->t_rawq.c_cf;
2308 tabc = *cp; /* XXX FIX NEXTC */
2309 for (; cp; cp = nextc(&tp->t_rawq, cp, &tabc))
2311 CLR(tp->t_lflag, FLUSHO);
2312 CLR(tp->t_state, TS_CNTTB);
2315 /* savecol will now be length of the tab. */
2316 savecol -= tp->t_column;
2317 tp->t_column += savecol;
2319 savecol = 8; /* overflow screw */
2320 while (--savecol >= 0)
2321 (void)ttyoutput('\b', tp);
2324 #define PANICSTR "ttyrub: would panic c = %d, val = %d\n"
2325 (void)kprintf(PANICSTR, c, CCLASS(c));
2327 panic(PANICSTR, c, CCLASS(c));
2331 } else if (ISSET(tp->t_lflag, ECHOPRT)) {
2332 if (!ISSET(tp->t_state, TS_ERASE)) {
2333 SET(tp->t_state, TS_ERASE);
2334 (void)ttyoutput('\\', tp);
2338 ttyecho(tp->t_cc[VERASE], tp);
2340 * This code may be executed not only when an ERASE key
2341 * is pressed, but also when ^U (KILL) or ^W (WERASE) are.
2342 * So, I didn't think it was worthwhile to pass the extra
2343 * information (which would need an extra parameter,
2344 * changing every call) needed to distinguish the ERASE2
2345 * case from the ERASE.
2352 * Back over cnt characters, erasing them.
2353 * NOTE: Must be called with tty_token held
2356 ttyrubo(struct tty *tp, int cnt)
2358 ASSERT_LWKT_TOKEN_HELD(&tty_token);
2360 (void)ttyoutput('\b', tp);
2361 (void)ttyoutput(' ', tp);
2362 (void)ttyoutput('\b', tp);
2368 * Reprint the rawq line. Note, it is assumed that c_cc has already
2370 * NOTE: Must be called with tty_token held
2373 ttyretype(struct tty *tp)
2378 ASSERT_LWKT_TOKEN_HELD(&tty_token);
2379 /* Echo the reprint character. */
2380 if (tp->t_cc[VREPRINT] != _POSIX_VDISABLE)
2381 ttyecho(tp->t_cc[VREPRINT], tp);
2383 (void)ttyoutput('\n', tp);
2387 * FIX: NEXTC IS BROKEN - DOESN'T CHECK QUOTE
2388 * BIT OF FIRST CHAR.
2391 for (cp = tp->t_canq.c_cf, c = (cp != NULL ? *cp : 0);
2392 cp != NULL; cp = nextc(&tp->t_canq, cp, &c))
2394 for (cp = tp->t_rawq.c_cf, c = (cp != NULL ? *cp : 0);
2395 cp != NULL; cp = nextc(&tp->t_rawq, cp, &c))
2397 CLR(tp->t_state, TS_ERASE);
2400 tp->t_rocount = tp->t_rawq.c_cc;
2405 * Echo a typed character to the terminal.
2406 * NOTE: Must be called with tty_token held
2409 ttyecho(int c, struct tty *tp)
2411 ASSERT_LWKT_TOKEN_HELD(&tty_token);
2413 if (!ISSET(tp->t_state, TS_CNTTB))
2414 CLR(tp->t_lflag, FLUSHO);
2415 if ((!ISSET(tp->t_lflag, ECHO) &&
2416 (c != '\n' || !ISSET(tp->t_lflag, ECHONL))) ||
2417 ISSET(tp->t_lflag, EXTPROC))
2419 if (ISSET(tp->t_lflag, ECHOCTL) &&
2420 ((ISSET(c, TTY_CHARMASK) <= 037 && c != '\t' && c != '\n') ||
2421 ISSET(c, TTY_CHARMASK) == 0177)) {
2422 (void)ttyoutput('^', tp);
2423 CLR(c, ~TTY_CHARMASK);
2429 (void)ttyoutput(c, tp);
2433 * Wake up any readers on a tty.
2436 ttwakeup(struct tty *tp)
2438 lwkt_gettoken(&tty_token);
2439 if (ISSET(tp->t_state, TS_ASYNC) && tp->t_sigio != NULL)
2440 pgsigio(tp->t_sigio, SIGIO, (tp->t_session != NULL));
2441 wakeup(TSA_HUP_OR_INPUT(tp));
2442 KNOTE(&tp->t_rkq.ki_note, 0);
2443 lwkt_reltoken(&tty_token);
2447 * Wake up any writers on a tty.
2450 ttwwakeup(struct tty *tp)
2452 lwkt_gettoken(&tty_token);
2453 if (ISSET(tp->t_state, TS_ASYNC) && tp->t_sigio != NULL)
2454 pgsigio(tp->t_sigio, SIGIO, (tp->t_session != NULL));
2455 if (ISSET(tp->t_state, TS_BUSY | TS_SO_OCOMPLETE) ==
2456 TS_SO_OCOMPLETE && tp->t_outq.c_cc == 0) {
2457 CLR(tp->t_state, TS_SO_OCOMPLETE);
2458 wakeup(TSA_OCOMPLETE(tp));
2460 if (ISSET(tp->t_state, TS_SO_OLOWAT) &&
2461 tp->t_outq.c_cc <= tp->t_olowat) {
2462 CLR(tp->t_state, TS_SO_OLOWAT);
2463 wakeup(TSA_OLOWAT(tp));
2465 KNOTE(&tp->t_wkq.ki_note, 0);
2466 lwkt_reltoken(&tty_token);
2470 * Look up a code for a specified speed in a conversion table;
2471 * used by drivers to map software speed values to hardware parameters.
2475 ttspeedtab(int speed, struct speedtab *table)
2478 for ( ; table->sp_speed != -1; table++)
2479 if (table->sp_speed == speed)
2480 return (table->sp_code);
2485 * Set input and output watermarks and buffer sizes. For input, the
2486 * high watermark is about one second's worth of input above empty, the
2487 * low watermark is slightly below high water, and the buffer size is a
2488 * driver-dependent amount above high water. For output, the watermarks
2489 * are near the ends of the buffer, with about 1 second's worth of input
2490 * between them. All this only applies to the standard line discipline.
2493 ttsetwater(struct tty *tp)
2495 int cps, ttmaxhiwat, x;
2497 lwkt_gettoken(&tty_token);
2499 clist_alloc_cblocks(&tp->t_canq, TTYHOG, 512);
2500 switch (tp->t_ispeedwat) {
2502 cps = tp->t_ispeed / 10;
2506 * This case is for old drivers that don't know about
2507 * t_ispeedwat. Arrange for them to get the old buffer
2508 * sizes and watermarks.
2510 cps = TTYHOG - 2 * 256;
2511 tp->t_ififosize = 2 * 2048;
2514 cps = tp->t_ispeedwat / 10;
2518 tp->t_ilowat = 7 * cps / 8;
2519 x = cps + tp->t_ififosize;
2520 clist_alloc_cblocks(&tp->t_rawq, x, x);
2523 switch (tp->t_ospeedwat) {
2525 cps = tp->t_ospeed / 10;
2526 ttmaxhiwat = 2 * TTMAXHIWAT;
2529 cps = tp->t_ospeed / 10;
2530 ttmaxhiwat = TTMAXHIWAT;
2533 cps = tp->t_ospeedwat / 10;
2534 ttmaxhiwat = 8 * TTMAXHIWAT;
2537 #define CLAMP(x, h, l) ((x) > h ? h : ((x) < l) ? l : (x))
2538 tp->t_olowat = x = CLAMP(cps / 2, TTMAXLOWAT, TTMINLOWAT);
2540 x = CLAMP(x, ttmaxhiwat, TTMINHIWAT); /* XXX clamps are too magic */
2541 tp->t_ohiwat = roundup(x, CBSIZE); /* XXX for compat */
2542 x = imax(tp->t_ohiwat, TTMAXHIWAT); /* XXX for compat/safety */
2544 clist_alloc_cblocks(&tp->t_outq, x, x);
2546 lwkt_reltoken(&tty_token);
2550 * Report on state of foreground process group.
2553 ttyinfo(struct tty *tp)
2555 struct proc *p, *pick;
2560 if (ttycheckoutq(tp,0) == 0)
2563 lwkt_gettoken(&tty_token);
2564 lwkt_gettoken(&proc_token);
2566 * We always print the load average, then figure out what else to
2567 * print based on the state of the current process group.
2569 tmp = (averunnable.ldavg[0] * 100 + FSCALE / 2) >> FSHIFT;
2570 ttyprintf(tp, "load: %d.%02d ", tmp / 100, tmp % 100);
2572 if (tp->t_session == NULL) {
2573 ttyprintf(tp, "not a controlling terminal\n");
2574 } else if (tp->t_pgrp == NULL) {
2575 ttyprintf(tp, "no foreground process group\n");
2576 } else if ((p = LIST_FIRST(&tp->t_pgrp->pg_members)) == NULL) {
2577 ttyprintf(tp, "empty foreground process group\n");
2580 * Pick an interesting process. Note that certain elements,
2581 * in particular the wmesg, require a critical section for
2582 * safe access (YYY and we are still not MP safe).
2584 * NOTE: lwp_wmesg is lwp_thread->td_wmesg.
2593 /* XXX lwp should compare lwps */
2595 for (pick = NULL; p != NULL; p = LIST_NEXT(p, p_pglist)) {
2596 if (proc_compare(pick, p))
2601 lp = FIRST_LWP_IN_PROC(pick);
2603 ttyprintf(tp, "foreground process without lwp\n");
2606 lwkt_reltoken(&proc_token);
2607 lwkt_reltoken(&tty_token);
2612 * Figure out what wait/process-state message, and command
2616 * XXX lwp This is a horrible mixture. We need to rework this
2617 * as soon as lwps have their own runnable status.
2619 if (pick->p_flag & P_WEXIT)
2621 else if (lp->lwp_stat == LSRUN)
2623 else if (pick->p_stat == SIDL)
2625 else if (lp->lwp_wmesg) /* lwp_thread must not be NULL */
2626 str = lp->lwp_wmesg;
2630 ksnprintf(buf, sizeof(buf), "cmd: %s %d [%s]",
2631 pick->p_comm, pick->p_pid, str);
2634 * Calculate cpu usage, percent cpu, and cmsz. Note that
2635 * 'pick' becomes invalid the moment we exit the critical
2638 if (lp->lwp_thread && (pick->p_flag & P_SWAPPEDOUT) == 0)
2639 calcru_proc(pick, &ru);
2641 pctcpu = (lp->lwp_pctcpu * 10000 + FSCALE / 2) >> FSHIFT;
2643 if (pick->p_stat == SIDL || pick->p_stat == SZOMB)
2646 vmsz = pgtok(vmspace_resident_count(pick->p_vmspace));
2653 ttyprintf(tp, " %s ", buf);
2654 ttyprintf(tp, "%ld.%02ldu ",
2655 ru.ru_utime.tv_sec, ru.ru_utime.tv_usec / 10000);
2656 ttyprintf(tp, "%ld.%02lds ",
2657 ru.ru_stime.tv_sec, ru.ru_stime.tv_usec / 10000);
2658 ttyprintf(tp, "%d%% %ldk\n", pctcpu / 100, vmsz);
2660 tp->t_rocount = 0; /* so pending input will be retyped if BS */
2661 lwkt_reltoken(&proc_token);
2662 lwkt_reltoken(&tty_token);
2666 * Returns 1 if p2 is "better" than p1
2668 * The algorithm for picking the "interesting" process is thus:
2670 * 1) Only foreground processes are eligible - implied.
2671 * 2) Runnable processes are favored over anything else. The runner
2672 * with the highest cpu utilization is picked (p_cpticks). Ties are
2673 * broken by picking the highest pid.
2674 * 3) The sleeper with the shortest sleep time is next. With ties,
2675 * we pick out just "short-term" sleepers (LWP_SINTR == 0).
2676 * 4) Further ties are broken by picking the highest pid.
2678 * NOTE: must be called with proc_token held.
2680 #define ISRUN(lp) ((lp)->lwp_stat == LSRUN)
2681 #define TESTAB(a, b) ((a)<<1 | (b))
2687 proc_compare(struct proc *p1, struct proc *p2)
2689 struct lwp *lp1, *lp2;
2691 ASSERT_LWKT_TOKEN_HELD(&proc_token);
2699 switch (TESTAB(p1->p_stat == SZOMB, p2->p_stat == SZOMB)) {
2705 return (p2->p_pid > p1->p_pid); /* tie - return highest pid */
2709 lp1 = FIRST_LWP_IN_PROC(p1);
2710 lp2 = FIRST_LWP_IN_PROC(p2);
2713 * see if at least one of them is runnable
2715 switch (TESTAB(ISRUN(lp1), ISRUN(lp2))) {
2722 * tie - favor one with highest recent cpu utilization
2724 if (lp2->lwp_cpticks > lp1->lwp_cpticks)
2726 if (lp1->lwp_cpticks > lp2->lwp_cpticks)
2728 return (p2->p_pid > p1->p_pid); /* tie - return highest pid */
2731 * pick the one with the smallest sleep time
2733 if (lp2->lwp_slptime > lp1->lwp_slptime)
2735 if (lp1->lwp_slptime > lp2->lwp_slptime)
2738 * favor one sleeping in a non-interruptible sleep
2740 if (lp1->lwp_flag & LWP_SINTR && (lp2->lwp_flag & LWP_SINTR) == 0)
2742 if (lp2->lwp_flag & LWP_SINTR && (lp1->lwp_flag & LWP_SINTR) == 0)
2744 return (p2->p_pid > p1->p_pid); /* tie - return highest pid */
2748 * Output char to tty; console putchar style.
2751 tputchar(int c, struct tty *tp)
2754 lwkt_gettoken(&tty_token);
2755 if (!ISSET(tp->t_state, TS_CONNECTED)) {
2756 lwkt_reltoken(&tty_token);
2761 (void)ttyoutput('\r', tp);
2762 (void)ttyoutput(c, tp);
2764 lwkt_reltoken(&tty_token);
2770 * Sleep on chan, returning ERESTART if tty changed while we napped and
2771 * returning any errors (e.g. EINTR/EWOULDBLOCK) reported by tsleep. If
2772 * the tty is revoked, restarting a pending call will redo validation done
2773 * at the start of the call.
2776 ttysleep(struct tty *tp, void *chan, int slpflags, char *wmesg, int timo)
2782 error = tsleep(chan, slpflags, wmesg, timo);
2785 return (tp->t_gen == gen ? 0 : ERESTART);
2791 * We bump the gen to force any ttysleep()'s to return with ERESTART
2792 * and flush the tty. The related fp's should already have been
2793 * replaced so the tty will close when the last references on the
2794 * original fp's go away.
2797 ttyrevoke(struct dev_revoke_args *ap)
2801 lwkt_gettoken(&tty_token);
2802 tp = ap->a_head.a_dev->si_tty;
2804 ttyflush(tp, FREAD | FWRITE);
2805 wakeup(TSA_CARR_ON(tp));
2808 lwkt_reltoken(&tty_token);
2813 * Allocate a tty struct. Clists in the struct will be allocated by
2817 ttymalloc(struct tty *tp)
2823 tp = kmalloc(sizeof *tp, M_TTYS, M_WAITOK|M_ZERO);
2829 ttyunregister(struct tty *tp)
2831 lwkt_gettoken(&tty_token);
2832 KKASSERT(ISSET(tp->t_state, TS_REGISTERED));
2833 CLR(tp->t_state, TS_REGISTERED);
2834 TAILQ_REMOVE(&tty_list, tp, t_list);
2835 lwkt_reltoken(&tty_token);
2839 ttyregister(struct tty *tp)
2841 lwkt_gettoken(&tty_token);
2842 KKASSERT(!ISSET(tp->t_state, TS_REGISTERED));
2843 SET(tp->t_state, TS_REGISTERED);
2844 TAILQ_INSERT_HEAD(&tty_list, tp, t_list);
2845 lwkt_reltoken(&tty_token);
2849 sysctl_kern_ttys(SYSCTL_HANDLER_ARGS)
2856 bzero(&marker, sizeof(marker));
2857 marker.t_state = TS_MARKER;
2860 lwkt_gettoken(&tty_token);
2862 TAILQ_INSERT_HEAD(&tty_list, &marker, t_list);
2863 while ((tp = TAILQ_NEXT(&marker, t_list)) != NULL) {
2864 TAILQ_REMOVE(&tty_list, &marker, t_list);
2865 TAILQ_INSERT_AFTER(&tty_list, tp, &marker, t_list);
2866 if (tp->t_state & TS_MARKER)
2870 t.t_dev = (cdev_t)(uintptr_t)dev2udev(t.t_dev);
2871 error = SYSCTL_OUT(req, (caddr_t)&t, sizeof(t));
2875 TAILQ_REMOVE(&tty_list, &marker, t_list);
2876 lwkt_reltoken(&tty_token);
2880 SYSCTL_PROC(_kern, OID_AUTO, ttys, CTLTYPE_OPAQUE|CTLFLAG_RD,
2881 0, 0, sysctl_kern_ttys, "S,tty", "All struct ttys");
2884 nottystop(struct tty *tp, int rw)
2890 ttyread(struct dev_read_args *ap)
2895 tp = ap->a_head.a_dev->si_tty;
2898 lwkt_gettoken(&tty_token);
2899 ret = ((*linesw[tp->t_line].l_read)(tp, ap->a_uio, ap->a_ioflag));
2900 lwkt_reltoken(&tty_token);
2906 ttywrite(struct dev_write_args *ap)
2911 tp = ap->a_head.a_dev->si_tty;
2914 lwkt_gettoken(&tty_token);
2915 ret = ((*linesw[tp->t_line].l_write)(tp, ap->a_uio, ap->a_ioflag));
2916 lwkt_reltoken(&tty_token);