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. Neither the name of the University nor the names of its contributors
21 * may be used to endorse or promote products derived from this software
22 * without specific prior written permission.
24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * @(#)tty.c 8.8 (Berkeley) 1/21/94
37 * $FreeBSD: src/sys/kern/tty.c,v 1.129.2.5 2002/03/11 01:32:31 dd Exp $
42 * Almost all functions in this file are acquiring the tty token due to their
43 * access and modifications of the 'tp' (struct tty) objects.
48 * o Fix races for sending the start char in ttyflush().
49 * o Handle inter-byte timeout for "MIN > 0, TIME > 0" in ttyselect().
50 * With luck, there will be MIN chars before select() returns().
51 * o Handle CLOCAL consistently for ptys. Perhaps disallow setting it.
52 * o Don't allow input in TS_ZOMBIE case. It would be visible through
54 * o Do the new sio locking stuff here and use it to avoid special
57 * o Move EXTPROC and/or PENDIN to t_state?
58 * o Wrap most of ttioctl in spltty/splx.
59 * o Implement TIOCNOTTY or remove it from <sys/ioctl.h>.
60 * o Send STOP if IXOFF is toggled off while TS_TBLOCK is set.
61 * o Don't allow certain termios flags to affect disciplines other
62 * than TTYDISC. Cancel their effects before switch disciplines
63 * and ignore them if they are set while we are in another
65 * o Now that historical speed conversions are handled here, don't
67 * o Check for TS_CARR_ON being set while everything is closed and not
68 * waiting for carrier. TS_CARR_ON isn't cleared if nothing is open,
69 * so it would live until the next open even if carrier drops.
70 * o Restore TS_WOPEN since it is useful in pstat. It must be cleared
71 * only when _all_ openers leave open().
74 #include "opt_uconsole.h"
76 #include <sys/param.h>
77 #include <sys/systm.h>
79 #include <sys/filio.h>
80 #include <sys/malloc.h>
85 #include <sys/ttydefaults.h> /* for ttydefchars, CEOT */
87 #include <sys/fcntl.h>
89 #include <sys/dkstat.h>
90 #include <sys/kernel.h>
91 #include <sys/vnode.h>
92 #include <sys/signalvar.h>
93 #include <sys/signal2.h>
94 #include <sys/resourcevar.h>
95 #include <sys/filedesc.h>
96 #include <sys/sysctl.h>
97 #include <sys/thread2.h>
100 #include <sys/lock.h>
102 #include <vm/vm_map.h>
103 #include <vm/vm_extern.h>
105 MALLOC_DEFINE(M_TTYS, "ttys", "tty data structures");
107 static int proc_compare (struct proc *p1, struct proc *p2);
108 static int ttnread (struct tty *tp);
109 static void ttyecho (int c, struct tty *tp);
110 static int ttyoutput (int c, struct tty *tp);
111 static void ttypend (struct tty *tp);
112 static void ttyretype (struct tty *tp);
113 static void ttyrub (int c, struct tty *tp);
114 static void ttyrubo (struct tty *tp, int cnt);
115 static void ttyunblock (struct tty *tp);
116 static int ttywflush (struct tty *tp);
117 static int filt_ttyread (struct knote *kn, long hint);
118 static void filt_ttyrdetach (struct knote *kn);
119 static int filt_ttywrite (struct knote *kn, long hint);
120 static void filt_ttywdetach (struct knote *kn);
123 * Table with character classes and parity. The 8th bit indicates parity,
124 * the 7th bit indicates the character is an alphameric or underscore (for
125 * ALTWERASE), and the low 6 bits indicate delay type. If the low 6 bits
126 * are 0 then the character needs no special processing on output; classes
127 * other than 0 might be translated or (not currently) require delays.
129 #define E 0x00 /* Even parity. */
130 #define O 0x80 /* Odd parity. */
131 #define PARITY(c) (char_type[c] & O)
133 #define ALPHA 0x40 /* Alpha or underscore. */
134 #define ISALPHA(c) (char_type[(c) & TTY_CHARMASK] & ALPHA)
136 #define CCLASSMASK 0x3f
137 #define CCLASS(c) (char_type[c] & CCLASSMASK)
142 #define NA ORDINARY | ALPHA
148 static u_char const char_type[] = {
149 E|CC, O|CC, O|CC, E|CC, O|CC, E|CC, E|CC, O|CC, /* nul - bel */
150 O|BS, E|TB, E|NL, O|CC, E|VT, O|CR, O|CC, E|CC, /* bs - si */
151 O|CC, E|CC, E|CC, O|CC, E|CC, O|CC, O|CC, E|CC, /* dle - etb */
152 E|CC, O|CC, O|CC, E|CC, O|CC, E|CC, E|CC, O|CC, /* can - us */
153 O|NO, E|NO, E|NO, O|NO, E|NO, O|NO, O|NO, E|NO, /* sp - ' */
154 E|NO, O|NO, O|NO, E|NO, O|NO, E|NO, E|NO, O|NO, /* ( - / */
155 E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA, /* 0 - 7 */
156 O|NA, E|NA, E|NO, O|NO, E|NO, O|NO, O|NO, E|NO, /* 8 - ? */
157 O|NO, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA, /* @ - G */
158 E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA, /* H - O */
159 E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA, /* P - W */
160 O|NA, E|NA, E|NA, O|NO, E|NO, O|NO, O|NO, O|NA, /* X - _ */
161 E|NO, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA, /* ` - g */
162 O|NA, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA, /* h - o */
163 O|NA, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA, /* p - w */
164 E|NA, O|NA, O|NA, E|NO, O|NO, E|NO, E|NO, O|CC, /* x - del */
166 * Meta chars; should be settable per character set;
167 * for now, treat them all as normal characters.
169 NA, NA, NA, NA, NA, NA, NA, NA,
170 NA, NA, NA, NA, NA, NA, NA, NA,
171 NA, NA, NA, NA, NA, NA, NA, NA,
172 NA, NA, NA, NA, NA, NA, NA, NA,
173 NA, NA, NA, NA, NA, NA, NA, NA,
174 NA, NA, NA, NA, NA, NA, NA, NA,
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,
195 /* Macros to clear/set/test flags. */
196 #define SET(t, f) (t) |= (f)
197 #define CLR(t, f) (t) &= ~(f)
198 #define ISSET(t, f) ((t) & (f))
200 #undef MAX_INPUT /* XXX wrong in <sys/syslimits.h> */
201 #define MAX_INPUT TTYHOG /* XXX limit is usually larger for !ICANON */
204 SYSCTL_OPAQUE(_kern, OID_AUTO, tk_nin, CTLFLAG_RD, &tk_nin, sizeof(tk_nin),
205 "LU", "TTY input statistic");
207 SYSCTL_OPAQUE(_kern, OID_AUTO, tk_nout, CTLFLAG_RD, &tk_nout, sizeof(tk_nout),
208 "LU", "TTY output statistic");
212 * list of struct tty where pstat(8) can pick it up with sysctl
214 static TAILQ_HEAD(, tty) tty_list = TAILQ_HEAD_INITIALIZER(tty_list);
217 * Initial open of tty, or (re)entry to standard tty line discipline.
220 ttyopen(cdev_t device, struct tty *tp)
222 lwkt_gettoken(&tp->t_token);
224 if (!ISSET(tp->t_state, TS_ISOPEN)) {
225 SET(tp->t_state, TS_ISOPEN);
226 if (ISSET(tp->t_cflag, CLOCAL)) {
227 SET(tp->t_state, TS_CONNECTED);
229 bzero(&tp->t_winsize, sizeof(tp->t_winsize));
232 lwkt_reltoken(&tp->t_token);
238 * Handle close() on a tty line: flush and set to initial state,
239 * bumping generation number so that pending read/write calls
240 * can detect recycling of the tty.
242 * XXX our caller should have done `spltty(); l_close(); ttyclose();'
243 * and l_close() should have flushed, but we repeat the spltty() and
244 * the flush in case there are buggy callers.
247 ttyclose(struct tty *tp)
249 lwkt_gettoken(&tp->t_token);
250 funsetown(&tp->t_sigio);
254 ttyflush(tp, FREAD | FWRITE);
255 clist_free_cblocks(&tp->t_canq);
256 clist_free_cblocks(&tp->t_outq);
257 clist_free_cblocks(&tp->t_rawq);
260 tp->t_line = TTYDISC;
262 tp->t_state &= TS_REGISTERED; /* clear all bits except */
263 lwkt_reltoken(&tp->t_token);
269 * Disassociate the tty from its session. Traditionally this has only been
270 * a half-close, meaning that the session was still allowed to point at the
271 * tty (resulting in the tty in the ps command showing something like 'p0-'),
272 * even though the tty is no longer pointing at the session.
274 * The half close seems to be useful only for 'ps' output but there is as
275 * yet no reason to remove the feature. The full-close code is currently
276 * #if 0'd out. See also sess_rele() in kern/kern_proc.c.
279 ttyclearsession(struct tty *tp)
282 struct procglob *prg;
285 lwkt_gettoken(&tp->t_token);
294 if ((sp = tp->t_session) != NULL) {
296 lwkt_gettoken(&prg->proc_token);
297 if (sp != tp->t_session) {
298 lwkt_reltoken(&prg->proc_token);
301 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);
313 lwkt_reltoken(&prg->proc_token);
315 lwkt_reltoken(&tp->t_token);
319 * Release the tty vnode association for a session. This is the
320 * 'other half' of the close. Because multiple opens of /dev/tty
321 * only generate a single open to the actual tty, the file modes
322 * are locked to FREAD|FWRITE.
324 * If dorevoke is non-zero, the session is also revoked. We have to
325 * close the vnode if VCTTYISOPEN is set.
328 ttyclosesession(struct session *sp, int dorevoke)
331 struct procglob *prg;
334 lwkt_gettoken(&prg->proc_token);
337 * There may not be a controlling terminal or it may have been closed
340 if ((vp = sp->s_ttyvp) == NULL) {
341 lwkt_reltoken(&prg->proc_token);
346 * We need a lock if we have to close or revoke.
348 if ((vp->v_flag & VCTTYISOPEN) || dorevoke) {
350 if (vn_lock(vp, LK_EXCLUSIVE | LK_RETRY | LK_FAILRECLAIM)) {
356 * Retry if the vnode was ripped out from under us
358 if (vp != sp->s_ttyvp) {
365 * Close and revoke as needed
368 if (vp->v_flag & VCTTYISOPEN) {
369 vclrflags(vp, VCTTYISOPEN);
370 VOP_CLOSE(vp, FREAD|FWRITE, NULL);
374 vrevoke(vp, proc0.p_ucred);
380 lwkt_reltoken(&prg->proc_token);
383 #define FLUSHQ(q) { \
385 ndflush(q, (q)->c_cc); \
388 /* Is 'c' a line delimiter ("break" character)? */
389 #define TTBREAKC(c, lflag) \
390 ((c) == '\n' || (((c) == cc[VEOF] || \
391 (c) == cc[VEOL] || ((c) == cc[VEOL2] && lflag & IEXTEN)) && \
392 (c) != _POSIX_VDISABLE))
395 * Process input of a single character received on a tty.
398 ttyinput(int c, struct tty *tp)
400 tcflag_t iflag, lflag;
404 lwkt_gettoken(&tp->t_token);
406 * If input is pending take it first.
409 if (ISSET(lflag, PENDIN))
414 if (ISSET(lflag, ICANON))
421 * Block further input iff:
422 * current input > threshold AND input is available to user program
423 * AND input flow control is enabled and not yet invoked.
424 * The 3 is slop for PARMRK.
427 if (tp->t_rawq.c_cc + tp->t_canq.c_cc > tp->t_ihiwat - 3 &&
428 (!ISSET(lflag, ICANON) || tp->t_canq.c_cc != 0) &&
429 (ISSET(tp->t_cflag, CRTS_IFLOW) || ISSET(iflag, IXOFF)) &&
430 !ISSET(tp->t_state, TS_TBLOCK))
433 /* Handle exceptional conditions (break, parity, framing). */
435 err = (ISSET(c, TTY_ERRORMASK));
437 CLR(c, TTY_ERRORMASK);
438 if (ISSET(err, TTY_BI)) {
439 if (ISSET(iflag, IGNBRK)) {
440 lwkt_reltoken(&tp->t_token);
443 if (ISSET(iflag, BRKINT)) {
444 ttyflush(tp, FREAD | FWRITE);
445 pgsignal(tp->t_pgrp, SIGINT, 1);
448 if (ISSET(iflag, PARMRK))
450 } else if ((ISSET(err, TTY_PE) && ISSET(iflag, INPCK))
451 || ISSET(err, TTY_FE)) {
452 if (ISSET(iflag, IGNPAR)) {
453 lwkt_reltoken(&tp->t_token);
456 else if (ISSET(iflag, PARMRK)) {
458 if (tp->t_rawq.c_cc + tp->t_canq.c_cc >
461 clist_putc(0377 | TTY_QUOTE, &tp->t_rawq);
462 clist_putc(0 | TTY_QUOTE, &tp->t_rawq);
463 clist_putc(c | TTY_QUOTE, &tp->t_rawq);
470 if (!ISSET(tp->t_state, TS_TYPEN) && ISSET(iflag, ISTRIP))
472 if (!ISSET(lflag, EXTPROC)) {
474 * Check for literal nexting very first
476 if (ISSET(tp->t_state, TS_LNCH)) {
478 CLR(tp->t_state, TS_LNCH);
481 * Scan for special characters. This code
482 * is really just a big case statement with
483 * non-constant cases. The bottom of the
484 * case statement is labeled ``endcase'', so goto
485 * it after a case match, or similar.
489 * Control chars which aren't controlled
490 * by ICANON, ISIG, or IXON.
492 if (ISSET(lflag, IEXTEN)) {
493 if (CCEQ(cc[VLNEXT], c)) {
494 if (ISSET(lflag, ECHO)) {
495 if (ISSET(lflag, ECHOE)) {
496 (void)ttyoutput('^', tp);
497 (void)ttyoutput('\b', tp);
501 SET(tp->t_state, TS_LNCH);
504 if (CCEQ(cc[VDISCARD], c)) {
505 if (ISSET(lflag, FLUSHO))
506 CLR(tp->t_lflag, FLUSHO);
508 ttyflush(tp, FWRITE);
510 if (tp->t_rawq.c_cc + tp->t_canq.c_cc)
512 SET(tp->t_lflag, FLUSHO);
520 if (ISSET(lflag, ISIG)) {
521 if (CCEQ(cc[VINTR], c) || CCEQ(cc[VQUIT], c)) {
522 if (!ISSET(lflag, NOFLSH))
523 ttyflush(tp, FREAD | FWRITE);
526 CCEQ(cc[VINTR], c) ? SIGINT : SIGQUIT, 1);
529 if (CCEQ(cc[VSUSP], c)) {
530 if (!ISSET(lflag, NOFLSH))
533 pgsignal(tp->t_pgrp, SIGTSTP, 1);
538 * Handle start/stop characters.
540 if (ISSET(iflag, IXON)) {
541 if (CCEQ(cc[VSTOP], c)) {
542 if (!ISSET(tp->t_state, TS_TTSTOP)) {
543 SET(tp->t_state, TS_TTSTOP);
544 (*tp->t_stop)(tp, 0);
545 lwkt_reltoken(&tp->t_token);
548 if (!CCEQ(cc[VSTART], c)) {
549 lwkt_reltoken(&tp->t_token);
553 * if VSTART == VSTOP then toggle
557 if (CCEQ(cc[VSTART], c))
561 * IGNCR, ICRNL, & INLCR
564 if (ISSET(iflag, IGNCR)) {
565 lwkt_reltoken(&tp->t_token);
568 else if (ISSET(iflag, ICRNL))
570 } else if (c == '\n' && ISSET(iflag, INLCR))
573 if (!ISSET(tp->t_lflag, EXTPROC) && ISSET(lflag, ICANON)) {
575 * From here on down canonical mode character
576 * processing takes place.
579 * erase or erase2 (^H / ^?)
581 if (CCEQ(cc[VERASE], c) || CCEQ(cc[VERASE2], c) ) {
583 ttyrub(clist_unputc(&tp->t_rawq), tp);
589 if (CCEQ(cc[VKILL], c)) {
590 if (ISSET(lflag, ECHOKE) &&
591 tp->t_rawq.c_cc == tp->t_rocount &&
592 !ISSET(lflag, ECHOPRT))
593 while (tp->t_rawq.c_cc)
594 ttyrub(clist_unputc(&tp->t_rawq), tp);
597 if (ISSET(lflag, ECHOK) ||
598 ISSET(lflag, ECHOKE))
603 CLR(tp->t_state, TS_LOCAL);
609 if (CCEQ(cc[VWERASE], c) && ISSET(lflag, IEXTEN)) {
615 while ((c = clist_unputc(&tp->t_rawq)) == ' ' || c == '\t')
620 * erase last char of word and remember the
621 * next chars type (for ALTWERASE)
624 c = clist_unputc(&tp->t_rawq);
627 if (c == ' ' || c == '\t') {
628 clist_putc(c, &tp->t_rawq);
637 c = clist_unputc(&tp->t_rawq);
640 } while (c != ' ' && c != '\t' &&
641 (!ISSET(lflag, ALTWERASE) || ISALPHA(c) == ctype));
642 clist_putc(c, &tp->t_rawq);
648 if (CCEQ(cc[VREPRINT], c) && ISSET(lflag, IEXTEN)) {
653 * ^T - kernel info and generate SIGINFO
655 if (CCEQ(cc[VSTATUS], c) && ISSET(lflag, IEXTEN)) {
656 if (ISSET(lflag, ISIG))
657 pgsignal(tp->t_pgrp, SIGINFO, 1);
658 if (!ISSET(lflag, NOKERNINFO))
662 if (CCEQ(cc[VCHECKPT], c) && ISSET(lflag, IEXTEN)) {
663 if (ISSET(lflag, ISIG))
664 pgsignal(tp->t_pgrp, SIGCKPT, 1);
669 * Check for input buffer overflow
671 if (tp->t_rawq.c_cc + tp->t_canq.c_cc >= MAX_INPUT) {
673 if (ISSET(iflag, IMAXBEL)) {
674 if (tp->t_outq.c_cc < tp->t_ohiwat)
675 (void)ttyoutput(CTRL('g'), tp);
680 if (c == 0377 && ISSET(iflag, PARMRK) && !ISSET(iflag, ISTRIP) &&
681 ISSET(iflag, IGNBRK|IGNPAR) != (IGNBRK|IGNPAR)) {
682 clist_putc(0377 | TTY_QUOTE, &tp->t_rawq);
686 * Put data char in q for user and
687 * wakeup on seeing a line delimiter.
689 if (clist_putc(c, &tp->t_rawq) >= 0) {
690 if (!ISSET(lflag, ICANON)) {
695 if (TTBREAKC(c, lflag)) {
697 clist_catq(&tp->t_rawq, &tp->t_canq);
699 } else if (tp->t_rocount++ == 0)
700 tp->t_rocol = tp->t_column;
701 if (ISSET(tp->t_state, TS_ERASE)) {
703 * end of prterase \.../
705 CLR(tp->t_state, TS_ERASE);
706 (void)ttyoutput('/', tp);
710 if (CCEQ(cc[VEOF], c) && ISSET(lflag, ECHO)) {
712 * Place the cursor over the '^' of the ^D.
714 i = imin(2, tp->t_column - i);
716 (void)ttyoutput('\b', tp);
723 * IXANY means allow any character to restart output.
725 if (ISSET(tp->t_state, TS_TTSTOP) &&
726 !ISSET(iflag, IXANY) && cc[VSTART] != cc[VSTOP]) {
727 lwkt_reltoken(&tp->t_token);
731 CLR(tp->t_lflag, FLUSHO);
732 CLR(tp->t_state, TS_TTSTOP);
734 lwkt_reltoken(&tp->t_token);
735 return (ttstart(tp));
739 * Output a single character on a tty, doing output processing
740 * as needed (expanding tabs, newline processing, etc.).
741 * Returns < 0 if succeeds, otherwise returns char to resend.
745 ttyoutput(int c, struct tty *tp)
750 lwkt_gettoken(&tp->t_token);
752 if (!ISSET(oflag, OPOST)) {
753 if (ISSET(tp->t_lflag, FLUSHO)) {
754 lwkt_reltoken(&tp->t_token);
757 if (clist_putc(c, &tp->t_outq)) {
758 lwkt_reltoken(&tp->t_token);
763 lwkt_reltoken(&tp->t_token);
767 * Do tab expansion if OXTABS aka TAB3 is set. Special case if we
768 * external processing, we don't do the tab expansion because we'll
769 * probably get it wrong. If tab expansion needs to be done, let
770 * it happen externally.
772 CLR(c, ~TTY_CHARMASK);
774 ISSET(oflag, OXTABS) && !ISSET(tp->t_lflag, EXTPROC)) {
775 c = 8 - (tp->t_column & 7);
776 if (!ISSET(tp->t_lflag, FLUSHO)) {
777 c -= clist_btoq(" ", c, &tp->t_outq);
782 lwkt_reltoken(&tp->t_token);
783 return (c ? -1 : '\t');
785 if (c == CEOT && ISSET(oflag, ONOEOT)) {
786 lwkt_reltoken(&tp->t_token);
791 * Newline translation: if ONLCR is set,
792 * translate newline into "\r\n".
794 if (c == '\n' && ISSET(tp->t_oflag, ONLCR)) {
797 if (!ISSET(tp->t_lflag, FLUSHO) && clist_putc('\r', &tp->t_outq)) {
798 lwkt_reltoken(&tp->t_token);
802 /* If OCRNL is set, translate "\r" into "\n". */
803 else if (c == '\r' && ISSET(tp->t_oflag, OCRNL))
805 /* If ONOCR is set, don't transmit CRs when on column 0. */
806 else if (c == '\r' && ISSET(tp->t_oflag, ONOCR) && tp->t_column == 0) {
807 lwkt_reltoken(&tp->t_token);
813 if (!ISSET(tp->t_lflag, FLUSHO) && clist_putc(c, &tp->t_outq)) {
814 lwkt_reltoken(&tp->t_token);
827 if (ISSET(tp->t_oflag, ONLCR | ONLRET))
837 col = (col + 8) & ~7;
841 lwkt_reltoken(&tp->t_token);
847 * Ioctls for all tty devices. Called after line-discipline specific ioctl
848 * has been called to do discipline-specific functions and/or reject any
849 * of these ioctl commands.
853 ttioctl(struct tty *tp, u_long cmd, void *data, int flag)
855 struct thread *td = curthread;
856 struct lwp *lp = td->td_lwp;
857 struct proc *p = td->td_proc;
863 lwkt_gettoken(&tp->t_token);
864 lwkt_gettoken(&p->p_token);
866 /* If the ioctl involves modification, hang if in the background. */
890 while (isbackground(p, tp) && !(p->p_flags & P_PPWAIT) &&
891 !SIGISMEMBER(p->p_sigignore, SIGTTOU) &&
892 !SIGISMEMBER(lp->lwp_sigmask, SIGTTOU)) {
893 if (p->p_pgrp->pg_jobc == 0) {
894 lwkt_reltoken(&p->p_token);
895 lwkt_reltoken(&tp->t_token);
898 pgsignal(p->p_pgrp, SIGTTOU, 1);
899 error = ttysleep(tp, &lbolt, PCATCH, "ttybg1",
902 lwkt_reltoken(&p->p_token);
903 lwkt_reltoken(&tp->t_token);
910 switch (cmd) { /* Process the ioctl. */
911 case FIOASYNC: /* set/clear async i/o */
913 SET(tp->t_state, TS_ASYNC);
915 CLR(tp->t_state, TS_ASYNC);
917 case FIONREAD: /* get # bytes to read */
918 *(int *)data = ttnread(tp);
923 * Policy -- Don't allow FIOSETOWN on someone else's
926 if (tp->t_session != NULL && !isctty(p, tp)) {
927 lwkt_reltoken(&p->p_token);
928 lwkt_reltoken(&tp->t_token);
932 error = fsetown(*(int *)data, &tp->t_sigio);
934 lwkt_reltoken(&p->p_token);
935 lwkt_reltoken(&tp->t_token);
940 if (tp->t_session != NULL && !isctty(p, tp)) {
941 lwkt_reltoken(&p->p_token);
942 lwkt_reltoken(&tp->t_token);
945 *(int *)data = fgetown(&tp->t_sigio);
948 case TIOCEXCL: /* set exclusive use of tty */
949 SET(tp->t_state, TS_XCLUDE);
951 case TIOCFLUSH: { /* flush buffers */
952 int flags = *(int *)data;
955 flags = FREAD | FWRITE;
957 flags &= FREAD | FWRITE;
961 case TIOCCONS: /* become virtual console */
963 if (constty && constty != tp &&
964 ISSET(constty->t_state, TS_CONNECTED)) {
965 lwkt_reltoken(&p->p_token);
966 lwkt_reltoken(&tp->t_token);
970 error = caps_priv_check_td(td, SYSCAP_RESTRICTEDROOT);
972 lwkt_reltoken(&p->p_token);
973 lwkt_reltoken(&tp->t_token);
978 } else if (tp == constty)
981 case TIOCDRAIN: /* wait till output drained */
984 lwkt_reltoken(&p->p_token);
985 lwkt_reltoken(&tp->t_token);
989 case TIOCGETA: { /* get termios struct */
990 struct termios *t = (struct termios *)data;
992 bcopy(&tp->t_termios, t, sizeof(struct termios));
995 case TIOCGETD: /* get line discipline */
996 *(int *)data = tp->t_line;
998 case TIOCGWINSZ: /* get window size */
999 *(struct winsize *)data = tp->t_winsize;
1001 case TIOCGPGRP: /* get pgrp of tty */
1002 if (!isctty(p, tp)) {
1003 lwkt_reltoken(&p->p_token);
1004 lwkt_reltoken(&tp->t_token);
1007 *(int *)data = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PID;
1009 case TIOCGSID: /* get sid of tty */
1010 if (!isctty(p, tp)) {
1011 lwkt_reltoken(&p->p_token);
1012 lwkt_reltoken(&tp->t_token);
1015 *(int *)data = tp->t_session->s_sid;
1018 case TIOCHPCL: /* hang up on last close */
1019 SET(tp->t_cflag, HUPCL);
1022 case TIOCNXCL: /* reset exclusive use of tty */
1023 CLR(tp->t_state, TS_XCLUDE);
1025 case TIOCOUTQ: /* output queue size */
1026 *(int *)data = tp->t_outq.c_cc;
1028 case TIOCSETA: /* set termios struct */
1029 case TIOCSETAW: /* drain output, set */
1030 case TIOCSETAF: { /* drn out, fls in, set */
1031 struct termios *t = (struct termios *)data;
1033 if (t->c_ispeed == 0)
1034 t->c_ispeed = t->c_ospeed;
1035 if (t->c_ispeed == 0)
1036 t->c_ispeed = tp->t_ospeed;
1037 if (t->c_ispeed == 0) {
1038 lwkt_reltoken(&p->p_token);
1039 lwkt_reltoken(&tp->t_token);
1042 if (cmd == TIOCSETAW || cmd == TIOCSETAF) {
1043 error = ttywait(tp);
1045 lwkt_reltoken(&p->p_token);
1046 lwkt_reltoken(&tp->t_token);
1049 if (cmd == TIOCSETAF)
1050 ttyflush(tp, FREAD);
1052 if (!ISSET(t->c_cflag, CIGNORE)) {
1054 * Set device hardware.
1056 if (tp->t_param && (error = (*tp->t_param)(tp, t))) {
1057 lwkt_reltoken(&p->p_token);
1058 lwkt_reltoken(&tp->t_token);
1061 if (ISSET(t->c_cflag, CLOCAL) &&
1062 !ISSET(tp->t_cflag, CLOCAL)) {
1064 * XXX disconnections would be too hard to
1065 * get rid of without this kludge. The only
1066 * way to get rid of controlling terminals
1067 * is to exit from the session leader.
1069 CLR(tp->t_state, TS_ZOMBIE);
1071 wakeup(TSA_CARR_ON(tp));
1075 if ((ISSET(tp->t_state, TS_CARR_ON) ||
1076 ISSET(t->c_cflag, CLOCAL)) &&
1077 !ISSET(tp->t_state, TS_ZOMBIE))
1078 SET(tp->t_state, TS_CONNECTED);
1080 CLR(tp->t_state, TS_CONNECTED);
1081 tp->t_cflag = t->c_cflag;
1082 tp->t_ispeed = t->c_ispeed;
1083 if (t->c_ospeed != 0)
1084 tp->t_ospeed = t->c_ospeed;
1087 if (ISSET(t->c_lflag, ICANON) != ISSET(tp->t_lflag, ICANON) &&
1089 if (ISSET(t->c_lflag, ICANON))
1090 SET(tp->t_lflag, PENDIN);
1093 * XXX we really shouldn't allow toggling
1094 * ICANON while we're in a non-termios line
1095 * discipline. Now we have to worry about
1096 * panicing for a null queue.
1098 if (tp->t_canq.c_ccmax > 0 &&
1099 tp->t_rawq.c_ccmax > 0) {
1100 clist_catq(&tp->t_rawq, &tp->t_canq);
1102 * XXX the queue limits may be
1103 * different, so the old queue
1104 * swapping method no longer works.
1106 clist_catq(&tp->t_canq, &tp->t_rawq);
1108 CLR(tp->t_lflag, PENDIN);
1112 tp->t_iflag = t->c_iflag;
1113 tp->t_oflag = t->c_oflag;
1115 * Make the EXTPROC bit read only.
1117 if (ISSET(tp->t_lflag, EXTPROC))
1118 SET(t->c_lflag, EXTPROC);
1120 CLR(t->c_lflag, EXTPROC);
1121 tp->t_lflag = t->c_lflag | ISSET(tp->t_lflag, PENDIN);
1122 if (t->c_cc[VMIN] != tp->t_cc[VMIN] ||
1123 t->c_cc[VTIME] != tp->t_cc[VTIME])
1125 bcopy(t->c_cc, tp->t_cc, sizeof(t->c_cc));
1128 case TIOCSETD: { /* set line discipline */
1129 int t = *(int *)data;
1130 cdev_t device = tp->t_dev;
1132 if ((u_int)t >= nlinesw) {
1133 lwkt_reltoken(&p->p_token);
1134 lwkt_reltoken(&tp->t_token);
1137 if (t != tp->t_line) {
1138 (*linesw[tp->t_line].l_close)(tp, flag);
1139 error = (*linesw[t].l_open)(device, tp);
1141 (void)(*linesw[tp->t_line].l_open)(device, tp);
1142 lwkt_reltoken(&p->p_token);
1143 lwkt_reltoken(&tp->t_token);
1150 case TIOCSTART: /* start output, like ^Q */
1151 if (ISSET(tp->t_state, TS_TTSTOP) ||
1152 ISSET(tp->t_lflag, FLUSHO)) {
1153 CLR(tp->t_lflag, FLUSHO);
1154 CLR(tp->t_state, TS_TTSTOP);
1158 case TIOCSTI: /* simulate terminal input */
1159 if ((flag & FREAD) == 0 &&
1160 caps_priv_check_td(td, SYSCAP_RESTRICTEDROOT))
1162 lwkt_reltoken(&p->p_token);
1163 lwkt_reltoken(&tp->t_token);
1166 if (!isctty(p, tp) &&
1167 caps_priv_check_td(td, SYSCAP_RESTRICTEDROOT))
1169 lwkt_reltoken(&p->p_token);
1170 lwkt_reltoken(&tp->t_token);
1173 (*linesw[tp->t_line].l_rint)(*(u_char *)data, tp);
1175 case TIOCSTOP: /* stop output, like ^S */
1176 if (!ISSET(tp->t_state, TS_TTSTOP)) {
1177 SET(tp->t_state, TS_TTSTOP);
1178 (*tp->t_stop)(tp, 0);
1181 case TIOCSCTTY: /* become controlling tty */
1182 /* Session ctty vnode pointer set in vnode layer. */
1183 if (!SESS_LEADER(p) ||
1184 ((p->p_session->s_ttyvp || tp->t_session) &&
1185 (tp->t_session != p->p_session))) {
1186 lwkt_reltoken(&p->p_token);
1187 lwkt_reltoken(&tp->t_token);
1191 tp->t_session = p->p_session;
1194 tp->t_pgrp = p->p_pgrp;
1195 otp = p->p_session->s_ttyp;
1196 p->p_session->s_ttyp = tp;
1197 p->p_flags |= P_CONTROLT;
1205 case TIOCSPGRP: { /* set pgrp of tty */
1206 pid_t pgid = *(int *)data;
1208 if (!isctty(p, tp)) {
1209 lwkt_reltoken(&p->p_token);
1210 lwkt_reltoken(&tp->t_token);
1213 else if (pgid < 1 || pgid > PID_MAX) {
1214 lwkt_reltoken(&p->p_token);
1215 lwkt_reltoken(&tp->t_token);
1218 struct pgrp *pgrp = pgfind(pgid);
1219 if (pgrp == NULL || pgrp->pg_session != p->p_session) {
1222 lwkt_reltoken(&p->p_token);
1223 lwkt_reltoken(&tp->t_token);
1235 case TIOCSTAT: /* simulate control-T */
1238 case TIOCSWINSZ: /* set window size */
1239 if (bcmp((caddr_t)&tp->t_winsize, data,
1240 sizeof (struct winsize))) {
1241 tp->t_winsize = *(struct winsize *)data;
1242 pgsignal(tp->t_pgrp, SIGWINCH, 1);
1245 case TIOCSDRAINWAIT:
1246 error = caps_priv_check_td(td, SYSCAP_RESTRICTEDROOT);
1248 lwkt_reltoken(&p->p_token);
1249 lwkt_reltoken(&tp->t_token);
1252 tp->t_timeout = *(int *)data * hz;
1253 wakeup(TSA_OCOMPLETE(tp));
1254 wakeup(TSA_OLOWAT(tp));
1256 case TIOCGDRAINWAIT:
1257 *(int *)data = tp->t_timeout / hz;
1260 lwkt_reltoken(&p->p_token);
1261 lwkt_reltoken(&tp->t_token);
1264 lwkt_reltoken(&p->p_token);
1265 lwkt_reltoken(&tp->t_token);
1269 static struct filterops ttyread_filtops =
1270 { FILTEROP_ISFD|FILTEROP_MPSAFE, NULL, filt_ttyrdetach, filt_ttyread };
1271 static struct filterops ttywrite_filtops =
1272 { FILTEROP_ISFD|FILTEROP_MPSAFE, NULL, filt_ttywdetach, filt_ttywrite };
1275 ttykqfilter(struct dev_kqfilter_args *ap)
1277 cdev_t dev = ap->a_head.a_dev;
1278 struct knote *kn = ap->a_kn;
1279 struct tty *tp = dev->si_tty;
1280 struct klist *klist;
1284 lwkt_gettoken(&tp->t_token);
1285 switch (kn->kn_filter) {
1287 klist = &tp->t_rkq.ki_note;
1288 kn->kn_fop = &ttyread_filtops;
1291 klist = &tp->t_wkq.ki_note;
1292 kn->kn_fop = &ttywrite_filtops;
1295 ap->a_result = EOPNOTSUPP;
1296 lwkt_reltoken(&tp->t_token);
1299 lwkt_reltoken(&tp->t_token);
1300 kn->kn_hook = (caddr_t)dev;
1301 knote_insert(klist, kn);
1307 filt_ttyrdetach(struct knote *kn)
1309 struct tty *tp = ((cdev_t)kn->kn_hook)->si_tty;
1311 lwkt_gettoken(&tp->t_token);
1312 knote_remove(&tp->t_rkq.ki_note, kn);
1313 lwkt_reltoken(&tp->t_token);
1317 filt_ttyread(struct knote *kn, long hint)
1319 struct tty *tp = ((cdev_t)kn->kn_hook)->si_tty;
1321 lwkt_gettoken(&tp->t_token);
1322 kn->kn_data = ttnread(tp);
1323 if (ISSET(tp->t_state, TS_ZOMBIE)) {
1324 kn->kn_flags |= (EV_EOF | EV_NODATA);
1325 lwkt_reltoken(&tp->t_token);
1328 lwkt_reltoken(&tp->t_token);
1329 return (kn->kn_data > 0);
1333 filt_ttywdetach(struct knote *kn)
1335 struct tty *tp = ((cdev_t)kn->kn_hook)->si_tty;
1337 lwkt_gettoken(&tp->t_token);
1338 knote_remove(&tp->t_wkq.ki_note, kn);
1339 lwkt_reltoken(&tp->t_token);
1343 filt_ttywrite(struct knote *kn, long hint)
1345 struct tty *tp = ((cdev_t)kn->kn_hook)->si_tty;
1348 lwkt_gettoken(&tp->t_token);
1349 kn->kn_data = tp->t_outq.c_cc;
1350 if (ISSET(tp->t_state, TS_ZOMBIE)) {
1351 lwkt_reltoken(&tp->t_token);
1354 ret = (kn->kn_data <= tp->t_olowat &&
1355 ISSET(tp->t_state, TS_CONNECTED));
1356 lwkt_reltoken(&tp->t_token);
1361 * NOTE: tp->t_token must be held.
1364 ttnread(struct tty *tp)
1368 ASSERT_LWKT_TOKEN_HELD(&tp->t_token);
1369 if (ISSET(tp->t_lflag, PENDIN))
1371 nread = tp->t_canq.c_cc;
1372 if (!ISSET(tp->t_lflag, ICANON)) {
1373 nread += tp->t_rawq.c_cc;
1374 if (nread < tp->t_cc[VMIN] && tp->t_cc[VTIME] == 0)
1381 * Wait for output to drain.
1384 ttywait(struct tty *tp)
1389 lwkt_gettoken(&tp->t_token);
1390 while ((tp->t_outq.c_cc || ISSET(tp->t_state, TS_BUSY)) &&
1391 ISSET(tp->t_state, TS_CONNECTED) && tp->t_oproc) {
1393 if ((tp->t_outq.c_cc || ISSET(tp->t_state, TS_BUSY)) &&
1394 ISSET(tp->t_state, TS_CONNECTED)) {
1395 SET(tp->t_state, TS_SO_OCOMPLETE);
1396 error = ttysleep(tp, TSA_OCOMPLETE(tp),
1400 if (error == EWOULDBLOCK)
1407 if (!error && (tp->t_outq.c_cc || ISSET(tp->t_state, TS_BUSY)))
1409 lwkt_reltoken(&tp->t_token);
1415 * Flush if successfully wait.
1418 ttywflush(struct tty *tp)
1422 if ((error = ttywait(tp)) == 0)
1423 ttyflush(tp, FREAD);
1428 * Flush tty read and/or write queues, notifying anyone waiting.
1431 ttyflush(struct tty *tp, int rw)
1433 lwkt_gettoken(&tp->t_token);
1438 FLUSHQ(&tp->t_outq);
1439 CLR(tp->t_state, TS_TTSTOP);
1441 (*tp->t_stop)(tp, rw);
1443 FLUSHQ(&tp->t_canq);
1444 FLUSHQ(&tp->t_rawq);
1445 CLR(tp->t_lflag, PENDIN);
1448 CLR(tp->t_state, TS_LOCAL);
1450 if (ISSET(tp->t_state, TS_TBLOCK)) {
1452 FLUSHQ(&tp->t_outq);
1456 * Don't let leave any state that might clobber the
1457 * next line discipline (although we should do more
1458 * to send the START char). Not clearing the state
1459 * may have caused the "putc to a clist with no
1460 * reserved cblocks" panic/kprintf.
1462 CLR(tp->t_state, TS_TBLOCK);
1464 #if 0 /* forget it, sleeping isn't always safe and we don't know when it is */
1465 if (ISSET(tp->t_iflag, IXOFF)) {
1467 * XXX wait a bit in the hope that the stop
1468 * character (if any) will go out. Waiting
1469 * isn't good since it allows races. This
1470 * will be fixed when the stop character is
1471 * put in a special queue. Don't bother with
1472 * the checks in ttywait() since the timeout
1475 SET(tp->t_state, TS_SO_OCOMPLETE);
1476 ttysleep(tp, TSA_OCOMPLETE(tp), 0,
1479 * Don't try sending the stop character again.
1481 CLR(tp->t_state, TS_TBLOCK);
1488 FLUSHQ(&tp->t_outq);
1491 lwkt_reltoken(&tp->t_token);
1495 * Copy in the default termios characters.
1498 termioschars(struct termios *t)
1500 bcopy(ttydefchars, t->c_cc, sizeof t->c_cc);
1507 ttychars(struct tty *tp)
1509 lwkt_gettoken(&tp->t_token);
1510 termioschars(&tp->t_termios);
1511 lwkt_reltoken(&tp->t_token);
1515 * Handle input high water. Send stop character for the IXOFF case. Turn
1516 * on our input flow control bit and propagate the changes to the driver.
1517 * XXX the stop character should be put in a special high priority queue.
1520 ttyblock(struct tty *tp)
1522 lwkt_gettoken(&tp->t_token);
1523 SET(tp->t_state, TS_TBLOCK);
1524 if (ISSET(tp->t_iflag, IXOFF) && tp->t_cc[VSTOP] != _POSIX_VDISABLE &&
1525 clist_putc(tp->t_cc[VSTOP], &tp->t_outq) != 0)
1526 CLR(tp->t_state, TS_TBLOCK); /* try again later */
1528 lwkt_reltoken(&tp->t_token);
1532 * Handle input low water. Send start character for the IXOFF case. Turn
1533 * off our input flow control bit and propagate the changes to the driver.
1534 * XXX the start character should be put in a special high priority queue.
1537 ttyunblock(struct tty *tp)
1539 lwkt_gettoken(&tp->t_token);
1540 CLR(tp->t_state, TS_TBLOCK);
1541 if (ISSET(tp->t_iflag, IXOFF) && tp->t_cc[VSTART] != _POSIX_VDISABLE &&
1542 clist_putc(tp->t_cc[VSTART], &tp->t_outq) != 0)
1543 SET(tp->t_state, TS_TBLOCK); /* try again later */
1545 lwkt_reltoken(&tp->t_token);
1549 ttstart(struct tty *tp)
1551 lwkt_gettoken(&tp->t_token);
1552 if (tp->t_oproc != NULL) /* XXX: Kludge for pty. */
1554 lwkt_reltoken(&tp->t_token);
1559 * "close" a line discipline
1562 ttylclose(struct tty *tp, int flag)
1564 lwkt_gettoken(&tp->t_token);
1565 if (flag & FNONBLOCK || ttywflush(tp))
1566 ttyflush(tp, FREAD | FWRITE);
1567 lwkt_reltoken(&tp->t_token);
1572 ttyhold(struct tty *tp)
1574 lwkt_gettoken(&tp->t_token);
1576 lwkt_reltoken(&tp->t_token);
1580 ttyunhold(struct tty *tp)
1582 lwkt_gettoken(&tp->t_token);
1587 lwkt_reltoken(&tp->t_token);
1591 * Handle modem control transition on a tty.
1592 * Flag indicates new state of carrier.
1593 * Returns 0 if the line should be turned off, otherwise 1.
1596 ttymodem(struct tty *tp, int flag)
1598 lwkt_gettoken(&tp->t_token);
1599 if (ISSET(tp->t_state, TS_CARR_ON) && ISSET(tp->t_cflag, MDMBUF)) {
1601 * MDMBUF: do flow control according to carrier flag
1602 * XXX TS_CAR_OFLOW doesn't do anything yet. TS_TTSTOP
1603 * works if IXON and IXANY are clear.
1606 CLR(tp->t_state, TS_CAR_OFLOW);
1607 CLR(tp->t_state, TS_TTSTOP);
1609 } else if (!ISSET(tp->t_state, TS_CAR_OFLOW)) {
1610 SET(tp->t_state, TS_CAR_OFLOW);
1611 SET(tp->t_state, TS_TTSTOP);
1612 (*tp->t_stop)(tp, 0);
1614 } else if (flag == 0) {
1618 CLR(tp->t_state, TS_CARR_ON);
1619 if (ISSET(tp->t_state, TS_ISOPEN) &&
1620 !ISSET(tp->t_cflag, CLOCAL)) {
1621 SET(tp->t_state, TS_ZOMBIE);
1622 CLR(tp->t_state, TS_CONNECTED);
1623 if (tp->t_session && tp->t_session->s_leader)
1624 ksignal(tp->t_session->s_leader, SIGHUP);
1625 ttyflush(tp, FREAD | FWRITE);
1626 lwkt_reltoken(&tp->t_token);
1633 SET(tp->t_state, TS_CARR_ON);
1634 if (!ISSET(tp->t_state, TS_ZOMBIE))
1635 SET(tp->t_state, TS_CONNECTED);
1636 wakeup(TSA_CARR_ON(tp));
1640 lwkt_reltoken(&tp->t_token);
1645 * Reinput pending characters after state switch
1648 ttypend(struct tty *tp)
1653 lwkt_gettoken(&tp->t_token);
1654 CLR(tp->t_lflag, PENDIN);
1655 SET(tp->t_state, TS_TYPEN);
1657 * XXX this assumes too much about clist internals. It may even
1658 * fail if the cblock slush pool is empty. We can't allocate more
1659 * cblocks here because we are called from an interrupt handler
1660 * and clist_alloc_cblocks() can wait.
1663 bzero(&tp->t_rawq, sizeof tp->t_rawq);
1664 clist_alloc_cblocks(&tp->t_rawq, tq.c_ccmax);
1665 while ((c = clist_getc(&tq)) >= 0)
1667 CLR(tp->t_state, TS_TYPEN);
1668 clist_free_cblocks(&tq);
1669 lwkt_reltoken(&tp->t_token);
1673 * Process a read call on a tty device.
1676 ttread(struct tty *tp, struct uio *uio, int flag)
1681 cc_t *cc = tp->t_cc;
1684 int first, error = 0;
1685 int has_stime = 0, last_cc = 0;
1686 long slp = 0; /* XXX this should be renamed `timo'. */
1687 struct timeval stime;
1689 lp = curthread->td_lwp;
1690 stime.tv_sec = 0; /* fix compiler warnings */
1693 lwkt_gettoken(&tp->t_token);
1695 lflag = tp->t_lflag;
1697 * take pending input first
1699 if (ISSET(lflag, PENDIN)) {
1701 splz(); /* reduce latency */
1702 lflag = tp->t_lflag; /* XXX ttypend() clobbers it */
1706 * Hang process if it's in the background.
1708 if ((pp = curproc) != NULL)
1709 lwkt_gettoken(&pp->p_token);
1710 if (pp && isbackground(pp, tp)) {
1711 if (SIGISMEMBER(pp->p_sigignore, SIGTTIN) ||
1712 SIGISMEMBER(lp->lwp_sigmask, SIGTTIN) ||
1713 (pp->p_flags & P_PPWAIT) || pp->p_pgrp->pg_jobc == 0) {
1714 lwkt_reltoken(&pp->p_token);
1715 lwkt_reltoken(&tp->t_token);
1718 pgsignal(pp->p_pgrp, SIGTTIN, 1);
1719 error = ttysleep(tp, &lbolt, PCATCH, "ttybg2", 0);
1721 lwkt_reltoken(&pp->p_token);
1722 lwkt_reltoken(&tp->t_token);
1725 lwkt_reltoken(&pp->p_token);
1729 lwkt_reltoken(&pp->p_token);
1731 if (ISSET(tp->t_state, TS_ZOMBIE)) {
1732 lwkt_reltoken(&tp->t_token);
1733 return (0); /* EOF */
1737 * If canonical, use the canonical queue,
1738 * else use the raw queue.
1740 * (should get rid of clists...)
1742 qp = ISSET(lflag, ICANON) ? &tp->t_canq : &tp->t_rawq;
1744 if (flag & IO_NDELAY) {
1747 if (!ISSET(lflag, ICANON) && cc[VMIN] == 0) {
1748 lwkt_reltoken(&tp->t_token);
1751 lwkt_reltoken(&tp->t_token);
1752 return (EWOULDBLOCK);
1754 if (!ISSET(lflag, ICANON)) {
1757 struct timeval timecopy;
1760 * Check each of the four combinations.
1761 * (m > 0 && t == 0) is the normal read case.
1762 * It should be fairly efficient, so we check that and its
1763 * companion case (m == 0 && t == 0) first.
1764 * For the other two cases, we compute the target sleep time
1773 /* m, t and qp->c_cc are all 0. 0 is enough input. */
1774 lwkt_reltoken(&tp->t_token);
1777 t *= 100000; /* time in us */
1778 #define diff(t1, t2) (((t1).tv_sec - (t2).tv_sec) * 1000000 + \
1779 ((t1).tv_usec - (t2).tv_usec))
1785 getmicrotime(&timecopy);
1786 if (has_stime == 0) {
1787 /* first character, start timer */
1791 } else if (qp->c_cc > last_cc) {
1792 /* got a character, restart timer */
1796 /* nothing, check expiration */
1797 slp = t - diff(timecopy, stime);
1802 } else { /* m == 0 */
1805 getmicrotime(&timecopy);
1806 if (has_stime == 0) {
1811 slp = t - diff(timecopy, stime);
1813 /* Timed out, but 0 is enough input. */
1814 lwkt_reltoken(&tp->t_token);
1821 * Rounding down may make us wake up just short
1822 * of the target, so we round up.
1823 * The formula is ceiling(slp * hz/1000000).
1824 * 32-bit arithmetic is enough for hz < 169.
1825 * XXX see tvtohz() for how to avoid overflow if hz
1826 * is large (divide by `tick' and/or arrange to
1827 * use tvtohz() if hz is large).
1829 slp = (long) (((u_long)slp * hz) + 999999) / 1000000;
1832 if (qp->c_cc <= 0) {
1835 * There is no input, or not enough input and we can block.
1837 error = ttysleep(tp, TSA_HUP_OR_INPUT(tp), PCATCH,
1838 ISSET(tp->t_state, TS_CONNECTED) ?
1839 "ttyin" : "ttyhup", (int)slp);
1840 if (error == EWOULDBLOCK)
1843 lwkt_reltoken(&tp->t_token);
1847 * XXX what happens if another process eats some input
1848 * while we are asleep (not just here)? It would be
1849 * safest to detect changes and reset our state variables
1850 * (has_stime and last_cc).
1857 * Input present, check for input mapping and processing.
1860 if (ISSET(lflag, ICANON | ISIG))
1866 icc = (int)szmin(uio->uio_resid, IBUFSIZ);
1867 icc = clist_qtob(qp, ibuf, icc);
1873 error = uiomove(ibuf, (size_t)icc, uio);
1875 * XXX if there was an error then we should ungetc() the
1876 * unmoved chars and reduce icc here.
1880 if (uio->uio_resid == 0)
1894 * delayed suspend (^Y)
1896 if (CCEQ(cc[VDSUSP], c) &&
1897 ISSET(lflag, IEXTEN | ISIG) == (IEXTEN | ISIG)) {
1898 pgsignal(tp->t_pgrp, SIGTSTP, 1);
1900 error = ttysleep(tp, &lbolt, PCATCH,
1909 * Interpret EOF only in canonical mode.
1911 if (CCEQ(cc[VEOF], c) && ISSET(lflag, ICANON))
1914 * Give user character.
1916 error = ureadc(c, uio);
1918 /* XXX should ungetc(c, qp). */
1920 if (uio->uio_resid == 0)
1923 * In canonical mode check for a "break character"
1924 * marking the end of a "line of input".
1926 if (ISSET(lflag, ICANON) && TTBREAKC(c, lflag))
1933 * Look to unblock input now that (presumably)
1934 * the input queue has gone down.
1936 if (ISSET(tp->t_state, TS_TBLOCK) &&
1937 tp->t_rawq.c_cc + tp->t_canq.c_cc <= tp->t_ilowat) {
1941 lwkt_reltoken(&tp->t_token);
1946 * Check the output queue on tp for space for a kernel message (from uprintf
1947 * or tprintf). Allow some space over the normal hiwater mark so we don't
1948 * lose messages due to normal flow control, but don't let the tty run amok.
1949 * Sleeps here are not interruptible, but we return prematurely if new signals
1953 ttycheckoutq(struct tty *tp, int wait)
1955 struct lwp *lp = curthread->td_lwp;
1957 sigset_t oldset, newset;
1959 lwkt_gettoken(&tp->t_token);
1960 hiwat = tp->t_ohiwat;
1961 SIGEMPTYSET(oldset);
1962 SIGEMPTYSET(newset);
1964 oldset = lwp_sigpend(lp);
1965 if (tp->t_outq.c_cc > hiwat + OBUFSIZ + 100) {
1966 while (tp->t_outq.c_cc > hiwat) {
1968 if (tp->t_outq.c_cc <= hiwat)
1971 newset = lwp_sigpend(lp);
1972 if (!wait || SIGSETNEQ(oldset, newset)) {
1973 lwkt_reltoken(&tp->t_token);
1976 SET(tp->t_state, TS_SO_OLOWAT);
1977 tsleep(TSA_OLOWAT(tp), 0, "ttoutq", hz);
1980 lwkt_reltoken(&tp->t_token);
1985 * Process a write call on a tty device.
1988 ttwrite(struct tty *tp, struct uio *uio, int flag)
1994 int i, hiwat, error;
1999 lwkt_gettoken(&tp->t_token);
2000 lp = curthread->td_lwp;
2001 hiwat = tp->t_ohiwat;
2002 cnt = uio->uio_resid;
2006 if (ISSET(tp->t_state, TS_ZOMBIE)) {
2007 if (uio->uio_resid == cnt)
2011 if (!ISSET(tp->t_state, TS_CONNECTED)) {
2012 if (flag & IO_NDELAY) {
2013 error = EWOULDBLOCK;
2016 error = ttysleep(tp, TSA_CARR_ON(tp), PCATCH, "ttydcd", 0);
2023 * Hang the process if it's in the background.
2025 if ((pp = curproc) != NULL)
2026 lwkt_gettoken(&pp->p_token);
2027 if (pp && isbackground(pp, tp) &&
2028 ISSET(tp->t_lflag, TOSTOP) && !(pp->p_flags & P_PPWAIT) &&
2029 !SIGISMEMBER(pp->p_sigignore, SIGTTOU) &&
2030 !SIGISMEMBER(lp->lwp_sigmask, SIGTTOU)) {
2031 if (pp->p_pgrp->pg_jobc == 0) {
2033 lwkt_reltoken(&pp->p_token);
2036 pgsignal(pp->p_pgrp, SIGTTOU, 1);
2037 lwkt_reltoken(&pp->p_token);
2038 error = ttysleep(tp, &lbolt, PCATCH, "ttybg4", 0);
2044 lwkt_reltoken(&pp->p_token);
2046 * Process the user's data in at most OBUFSIZ chunks. Perform any
2047 * output translation. Keep track of high water mark, sleep on
2048 * overflow awaiting device aid in acquiring new space.
2050 while (uio->uio_resid > 0 || cc > 0) {
2051 if (ISSET(tp->t_lflag, FLUSHO)) {
2053 lwkt_reltoken(&tp->t_token);
2056 if (tp->t_outq.c_cc > hiwat)
2059 * Grab a hunk of data from the user, unless we have some
2060 * leftover from last time.
2063 cc = szmin(uio->uio_resid, OBUFSIZ);
2065 error = uiomove(cp, (size_t)cc, uio);
2072 * If nothing fancy need be done, grab those characters we
2073 * can handle without any of ttyoutput's processing and
2074 * just transfer them to the output q. For those chars
2075 * which require special processing (as indicated by the
2076 * bits in char_type), call ttyoutput. After processing
2077 * a hunk of data, look for FLUSHO so ^O's will take effect
2081 if (!ISSET(tp->t_oflag, OPOST))
2084 ce = cc - scanc((u_int)cc, (u_char *)cp,
2085 char_type, CCLASSMASK);
2087 * If ce is zero, then we're processing
2088 * a special character through ttyoutput.
2092 if (ttyoutput(*cp, tp) >= 0) {
2093 /* No Clists, wait a bit. */
2095 if (flag & IO_NDELAY) {
2096 error = EWOULDBLOCK;
2099 error = ttysleep(tp, &lbolt,
2108 if (ISSET(tp->t_lflag, FLUSHO) ||
2109 tp->t_outq.c_cc > hiwat)
2115 * A bunch of normal characters have been found.
2116 * Transfer them en masse to the output queue and
2117 * continue processing at the top of the loop.
2118 * If there are any further characters in this
2119 * <= OBUFSIZ chunk, the first should be a character
2120 * requiring special handling by ttyoutput.
2123 i = clist_btoq(cp, ce, &tp->t_outq);
2126 cp += ce, cc -= ce, tk_nout += ce;
2129 /* No Clists, wait a bit. */
2131 if (flag & IO_NDELAY) {
2132 error = EWOULDBLOCK;
2135 error = ttysleep(tp, &lbolt, PCATCH,
2141 if (ISSET(tp->t_lflag, FLUSHO) ||
2142 tp->t_outq.c_cc > hiwat)
2149 * If cc is nonzero, we leave the uio structure inconsistent, as the
2150 * offset and iov pointers have moved forward, but it doesn't matter
2151 * (the call will either return short or restart with a new uio).
2153 uio->uio_resid += cc;
2154 lwkt_reltoken(&tp->t_token);
2160 * This can only occur if FLUSHO is set in t_lflag,
2161 * or if ttstart/oproc is synchronous (or very fast).
2163 if (tp->t_outq.c_cc <= hiwat) {
2166 if (flag & IO_NDELAY) {
2167 uio->uio_resid += cc;
2168 lwkt_reltoken(&tp->t_token);
2169 return (uio->uio_resid == cnt ? EWOULDBLOCK : 0);
2171 SET(tp->t_state, TS_SO_OLOWAT);
2172 error = ttysleep(tp, TSA_OLOWAT(tp), PCATCH, "ttywri", tp->t_timeout);
2173 if (error == EWOULDBLOCK)
2181 * Rubout one character from the rawq of tp
2182 * as cleanly as possible.
2183 * NOTE: Must be called with tp->t_token held
2186 ttyrub(int c, struct tty *tp)
2192 ASSERT_LWKT_TOKEN_HELD(&tp->t_token);
2193 if (!ISSET(tp->t_lflag, ECHO) || ISSET(tp->t_lflag, EXTPROC))
2195 CLR(tp->t_lflag, FLUSHO);
2196 if (ISSET(tp->t_lflag, ECHOE)) {
2197 if (tp->t_rocount == 0) {
2199 * Screwed by ttwrite; retype
2204 if (c == ('\t' | TTY_QUOTE) || c == ('\n' | TTY_QUOTE))
2207 CLR(c, ~TTY_CHARMASK);
2208 switch (CCLASS(c)) {
2217 if (ISSET(tp->t_lflag, ECHOCTL))
2221 if (tp->t_rocount < tp->t_rawq.c_cc) {
2225 savecol = tp->t_column;
2226 SET(tp->t_state, TS_CNTTB);
2227 SET(tp->t_lflag, FLUSHO);
2228 tp->t_column = tp->t_rocol;
2230 cp = clist_nextc(&tp->t_rawq, NULL, &tabc);
2233 cp = clist_nextc(&tp->t_rawq,
2236 CLR(tp->t_lflag, FLUSHO);
2237 CLR(tp->t_state, TS_CNTTB);
2239 /* savecol will now be length of the tab. */
2240 savecol -= tp->t_column;
2241 tp->t_column += savecol;
2243 savecol = 8; /* overflow screw */
2244 while (--savecol >= 0)
2245 (void)ttyoutput('\b', tp);
2248 #define PANICSTR "ttyrub: would panic c = %d, val = %d\n"
2249 (void)kprintf(PANICSTR, c, CCLASS(c));
2251 panic(PANICSTR, c, CCLASS(c));
2255 } else if (ISSET(tp->t_lflag, ECHOPRT)) {
2256 if (!ISSET(tp->t_state, TS_ERASE)) {
2257 SET(tp->t_state, TS_ERASE);
2258 (void)ttyoutput('\\', tp);
2262 ttyecho(tp->t_cc[VERASE], tp);
2264 * This code may be executed not only when an ERASE key
2265 * is pressed, but also when ^U (KILL) or ^W (WERASE) are.
2266 * So, I didn't think it was worthwhile to pass the extra
2267 * information (which would need an extra parameter,
2268 * changing every call) needed to distinguish the ERASE2
2269 * case from the ERASE.
2276 * Back over cnt characters, erasing them.
2277 * NOTE: Must be called with tp->t_token held
2280 ttyrubo(struct tty *tp, int cnt)
2282 ASSERT_LWKT_TOKEN_HELD(&tp->t_token);
2284 (void)ttyoutput('\b', tp);
2285 (void)ttyoutput(' ', tp);
2286 (void)ttyoutput('\b', tp);
2292 * Reprint the rawq line. Note, it is assumed that c_cc has already
2294 * NOTE: Must be called with tp->t_token held
2297 ttyretype(struct tty *tp)
2302 ASSERT_LWKT_TOKEN_HELD(&tp->t_token);
2303 /* Echo the reprint character. */
2304 if (tp->t_cc[VREPRINT] != _POSIX_VDISABLE)
2305 ttyecho(tp->t_cc[VREPRINT], tp);
2307 (void)ttyoutput('\n', tp);
2311 * FIX: NEXTC IS BROKEN - DOESN'T CHECK QUOTE
2312 * BIT OF FIRST CHAR.
2314 cp = clist_nextc(&tp->t_canq, NULL, &c);
2317 cp = clist_nextc(&tp->t_canq, cp, &c);
2319 cp = clist_nextc(&tp->t_rawq, NULL, &c);
2322 cp = clist_nextc(&tp->t_rawq, cp, &c);
2324 CLR(tp->t_state, TS_ERASE);
2326 tp->t_rocount = tp->t_rawq.c_cc;
2331 * Echo a typed character to the terminal.
2332 * NOTE: Must be called with tp->t_token held
2335 ttyecho(int c, struct tty *tp)
2337 ASSERT_LWKT_TOKEN_HELD(&tp->t_token);
2339 if (!ISSET(tp->t_state, TS_CNTTB))
2340 CLR(tp->t_lflag, FLUSHO);
2341 if ((!ISSET(tp->t_lflag, ECHO) &&
2342 (c != '\n' || !ISSET(tp->t_lflag, ECHONL))) ||
2343 ISSET(tp->t_lflag, EXTPROC))
2345 if (ISSET(tp->t_lflag, ECHOCTL) &&
2346 ((ISSET(c, TTY_CHARMASK) <= 037 && c != '\t' && c != '\n') ||
2347 ISSET(c, TTY_CHARMASK) == 0177)) {
2348 (void)ttyoutput('^', tp);
2349 CLR(c, ~TTY_CHARMASK);
2355 (void)ttyoutput(c, tp);
2359 * Wake up any readers on a tty.
2362 ttwakeup(struct tty *tp)
2364 lwkt_gettoken(&tp->t_token);
2365 if (ISSET(tp->t_state, TS_ASYNC) && tp->t_sigio != NULL)
2366 pgsigio(tp->t_sigio, SIGIO, (tp->t_session != NULL));
2367 wakeup(TSA_HUP_OR_INPUT(tp));
2368 KNOTE(&tp->t_rkq.ki_note, 0);
2369 lwkt_reltoken(&tp->t_token);
2373 * Wake up any writers on a tty.
2376 ttwwakeup(struct tty *tp)
2378 lwkt_gettoken(&tp->t_token);
2379 if (ISSET(tp->t_state, TS_ASYNC) && tp->t_sigio != NULL)
2380 pgsigio(tp->t_sigio, SIGIO, (tp->t_session != NULL));
2381 if (ISSET(tp->t_state, TS_BUSY | TS_SO_OCOMPLETE) ==
2382 TS_SO_OCOMPLETE && tp->t_outq.c_cc == 0) {
2383 CLR(tp->t_state, TS_SO_OCOMPLETE);
2384 wakeup(TSA_OCOMPLETE(tp));
2386 if (ISSET(tp->t_state, TS_SO_OLOWAT) &&
2387 tp->t_outq.c_cc <= tp->t_olowat) {
2388 CLR(tp->t_state, TS_SO_OLOWAT);
2389 wakeup(TSA_OLOWAT(tp));
2391 KNOTE(&tp->t_wkq.ki_note, 0);
2392 lwkt_reltoken(&tp->t_token);
2396 * Look up a code for a specified speed in a conversion table;
2397 * used by drivers to map software speed values to hardware parameters.
2401 ttspeedtab(int speed, struct speedtab *table)
2404 for ( ; table->sp_speed != -1; table++)
2405 if (table->sp_speed == speed)
2406 return (table->sp_code);
2411 * Set input and output watermarks and buffer sizes. For input, the
2412 * high watermark is about one second's worth of input above empty, the
2413 * low watermark is slightly below high water, and the buffer size is a
2414 * driver-dependent amount above high water. For output, the watermarks
2415 * are near the ends of the buffer, with about 1 second's worth of input
2416 * between them. All this only applies to the standard line discipline.
2418 #define CLAMP(x, h, l) ((x) > h ? h : ((x) < l) ? l : (x))
2421 ttsetwater(struct tty *tp)
2423 int ttmaxhiwat; /* maximum high water mark */
2424 int cps; /* characters per second */
2427 lwkt_gettoken(&tp->t_token);
2432 * Calculate nominal low and high water marks, leave a little
2433 * room to absorb flow control latencies.
2435 clist_alloc_cblocks(&tp->t_canq, TTYHOG);
2437 switch (tp->t_ispeedwat) {
2439 cps = tp->t_ispeed / 10;
2443 * This case is for old drivers that don't know about
2444 * t_ispeedwat. Arrange for them to get the old buffer
2445 * sizes and watermarks.
2447 cps = TTYHOG - 2 * 256;
2448 tp->t_ififosize = 2 * 2048;
2451 cps = tp->t_ispeedwat / 10;
2455 tp->t_ilowat = 7 * cps / 8;
2456 x = cps + tp->t_ififosize;
2457 clist_alloc_cblocks(&tp->t_rawq, x);
2462 * Calculate nominal low and high water marks, and make the
2463 * actual buffer just a tad larger to absorb flow control latencies.
2465 switch (tp->t_ospeedwat) {
2467 cps = tp->t_ospeed / 10;
2468 ttmaxhiwat = 2 * TTMAXHIWAT;
2471 cps = tp->t_ospeed / 10;
2472 ttmaxhiwat = TTMAXHIWAT;
2475 cps = tp->t_ospeedwat / 10;
2476 ttmaxhiwat = 8 * TTMAXHIWAT;
2480 x = CLAMP(cps / 2, TTMAXLOWAT, TTMINLOWAT);
2484 x = CLAMP(x, ttmaxhiwat, TTMINHIWAT);
2487 x = imax(tp->t_ohiwat, TTMAXHIWAT);
2489 clist_alloc_cblocks(&tp->t_outq, x);
2491 lwkt_reltoken(&tp->t_token);
2497 * Report on state of foreground process group.
2500 ttyinfo(struct tty *tp)
2503 struct proc *p, *pick;
2513 if (ttycheckoutq(tp,0) == 0)
2516 lwkt_gettoken(&tp->t_token);
2519 * We always print the load average, then figure out what else to
2520 * print based on the state of the current process group.
2522 tmp = (averunnable.ldavg[0] * 100 + FSCALE / 2) >> FSHIFT;
2523 ttyprintf(tp, "load: %d.%02d ", tmp / 100, tmp % 100);
2525 if (tp->t_session == NULL) {
2526 ttyprintf(tp, "not a controlling terminal\n");
2529 if ((pgrp = tp->t_pgrp) == NULL) {
2530 ttyprintf(tp, "no foreground process group\n");
2535 * Pick an interesting process. Note that certain elements,
2536 * in particular the wmesg.
2538 * NOTE: lwp_wmesg is lwp_thread->td_wmesg.
2541 lwkt_gettoken(&pgrp->pg_token);
2544 for (p = LIST_FIRST(&pgrp->pg_members);
2546 p = LIST_NEXT(p, p_pglist)) {
2548 if (proc_compare(pick, p)) {
2557 ttyprintf(tp, "empty foreground process group\n");
2562 * Pick an interesting LWP (XXX)
2566 lp = FIRST_LWP_IN_PROC(pick);
2569 ttyprintf(tp, "foreground process without lwp\n");
2574 * Figure out what wait/process-state message, and command
2578 * XXX lwp This is a horrible mixture. We need to rework this
2579 * as soon as lwps have their own runnable status.
2582 if (pick->p_flags & P_WEXIT)
2584 else if (lp->lwp_stat == LSRUN)
2586 else if (pick->p_stat == SIDL)
2588 else if (lp->lwp_wmesg) /* lwp_thread must not be NULL */
2589 str = lp->lwp_wmesg;
2593 ksnprintf(buf, sizeof(buf), "cmd: %s %d [%s]",
2594 pick->p_comm, pick->p_pid, str);
2597 * Calculate cpu usage, percent cpu, and cmsz. Note that
2598 * 'pick' becomes invalid the moment we release the token.
2601 calcru_proc(pick, &ru);
2603 pctcpu = (lp->lwp_pctcpu * 10000 + FSCALE / 2) >> FSHIFT;
2608 * NOTE: vmspace should be protected from destruction by the
2609 * combination of pg_token and the fact that we are not
2610 * flagged as a zombie.
2612 if (pick->p_stat == SIDL || pick->p_stat == SZOMB) {
2614 } else if ((vm = pick->p_vmspace) == NULL) {
2618 vmsz = pgtok(vmspace_resident_count(vm));
2626 ttyprintf(tp, " %s ",
2628 ttyprintf(tp, "%ld.%02ldu ",
2629 ru.ru_utime.tv_sec, ru.ru_utime.tv_usec / 10000);
2630 ttyprintf(tp, "%ld.%02lds ",
2631 ru.ru_stime.tv_sec, ru.ru_stime.tv_usec / 10000);
2632 ttyprintf(tp, "%d%% %ldk\n",
2633 pctcpu / 100, vmsz);
2636 lwkt_reltoken(&pgrp->pg_token);
2639 tp->t_rocount = 0; /* so pending input will be retyped if BS */
2640 lwkt_reltoken(&tp->t_token);
2644 * Returns 1 if p2 is "better" than p1
2646 * The algorithm for picking the "interesting" process is thus:
2648 * 1) Only foreground processes are eligible - implied.
2649 * 2) Runnable processes are favored over anything else. The runner
2650 * with the highest cpu utilization is picked (p_cpticks). Ties are
2651 * broken by picking the highest pid.
2652 * 3) The sleeper with the shortest sleep time is next. With ties,
2653 * we pick out just "short-term" sleepers (LWP_SINTR == 0).
2654 * 4) Further ties are broken by picking the highest pid.
2656 * NOTE: must be called with p1 and p2 held.
2658 #define ISRUN(lp) ((lp)->lwp_stat == LSRUN)
2659 #define TESTAB(a, b) ((a)<<1 | (b))
2665 proc_compare(struct proc *p1, struct proc *p2)
2667 struct lwp *lp1, *lp2;
2672 if (lwkt_trytoken(&p1->p_token) == 0)
2674 if (lwkt_trytoken(&p2->p_token) == 0) {
2675 lwkt_reltoken(&p1->p_token);
2682 switch (TESTAB(p1->p_stat == SZOMB, p2->p_stat == SZOMB)) {
2690 res = (p2->p_pid > p1->p_pid); /* tie - return highest pid */
2696 /* XXX choose the best lwp? */
2697 lp1 = FIRST_LWP_IN_PROC(p1);
2698 lp2 = FIRST_LWP_IN_PROC(p2);
2701 * Favor one with LWPs verses one that has none (is exiting).
2713 * see if at least one of them is runnable
2715 switch (TESTAB(ISRUN(lp1), ISRUN(lp2))) {
2724 * tie - favor one with highest recent cpu utilization
2726 if (lp2->lwp_cpticks > lp1->lwp_cpticks)
2728 else if (lp1->lwp_cpticks > lp2->lwp_cpticks)
2731 res = (p2->p_pid > p1->p_pid); /* tie - ret highest */
2738 * Pick the one with the smallest sleep time
2740 if (lp2->lwp_slptime > lp1->lwp_slptime) {
2744 if (lp1->lwp_slptime > lp2->lwp_slptime) {
2750 * Favor one sleeping in a non-interruptible sleep
2752 if ((lp1->lwp_flags & LWP_SINTR) && (lp2->lwp_flags & LWP_SINTR) == 0)
2755 if ((lp2->lwp_flags & LWP_SINTR) && (lp1->lwp_flags & LWP_SINTR) == 0)
2758 res = (p2->p_pid > p1->p_pid); /* tie - return highest pid */
2762 lwkt_reltoken(&p2->p_token);
2763 lwkt_reltoken(&p1->p_token);
2768 * Output char to tty; console putchar style.
2771 tputchar(int c, struct tty *tp)
2773 lwkt_gettoken(&tp->t_token);
2774 if (!ISSET(tp->t_state, TS_CONNECTED)) {
2775 lwkt_reltoken(&tp->t_token);
2779 (void)ttyoutput('\r', tp);
2780 (void)ttyoutput(c, tp);
2782 lwkt_reltoken(&tp->t_token);
2788 * Sleep on chan, returning ERESTART if tty changed while we napped and
2789 * returning any errors (e.g. EINTR/EWOULDBLOCK) reported by tsleep. If
2790 * the tty is revoked, restarting a pending call will redo validation done
2791 * at the start of the call.
2794 ttysleep(struct tty *tp, void *chan, int slpflags, char *wmesg, int timo)
2800 error = tsleep(chan, slpflags, wmesg, timo);
2803 return (tp->t_gen == gen ? 0 : ERESTART);
2809 * We bump the gen to force any ttysleep()'s to return with ERESTART
2810 * and flush the tty. The related fp's should already have been
2811 * replaced so the tty will close when the last references on the
2812 * original fp's go away.
2815 ttyrevoke(struct dev_revoke_args *ap)
2819 tp = ap->a_head.a_dev->si_tty;
2820 lwkt_gettoken(&tp->t_token);
2822 ttyflush(tp, FREAD | FWRITE);
2823 wakeup(TSA_CARR_ON(tp));
2826 lwkt_reltoken(&tp->t_token);
2832 * Allocate a tty struct. Clists in the struct will be allocated by
2833 * ttyopen(). The tty itself is protected by tp->t_token. tty_token
2834 * is primarily used to interlock the NULL test and for registration.
2836 * by convention, once allocated, tty structures are never freed. This
2837 * saves us from numerous release race scenarios that can occur due to the
2838 * token being embedded in the tty structure.
2841 ttymalloc(struct tty **tpp)
2845 if ((tp = *tpp) == NULL) {
2846 tp = kmalloc(sizeof *tp, M_TTYS, M_WAITOK|M_ZERO);
2847 lwkt_gettoken(&tty_token);
2848 if (*tpp == NULL) { /* recheck after blocking kmalloc */
2855 lwkt_reltoken(&tty_token);
2861 * Caller must hold tp->t_token
2864 ttyunregister(struct tty *tp)
2866 lwkt_gettoken(&tty_token);
2867 if (ISSET(tp->t_state, TS_REGISTERED)) {
2868 CLR(tp->t_state, TS_REGISTERED);
2869 TAILQ_REMOVE(&tty_list, tp, t_list);
2871 lwkt_reltoken(&tty_token);
2875 ttyinit(struct tty *tp)
2877 lwkt_token_init(&tp->t_token, "tp");
2881 ttyregister(struct tty *tp)
2883 lwkt_gettoken(&tty_token);
2884 if (!ISSET(tp->t_state, TS_REGISTERED)) {
2885 SET(tp->t_state, TS_REGISTERED);
2886 TAILQ_INSERT_HEAD(&tty_list, tp, t_list);
2888 lwkt_reltoken(&tty_token);
2892 sysctl_kern_ttys(SYSCTL_HANDLER_ARGS)
2899 bzero(&marker, sizeof(marker));
2900 marker.t_state = TS_MARKER;
2903 lwkt_gettoken(&tty_token);
2905 TAILQ_INSERT_HEAD(&tty_list, &marker, t_list);
2906 while ((tp = TAILQ_NEXT(&marker, t_list)) != NULL) {
2907 TAILQ_REMOVE(&tty_list, &marker, t_list);
2908 TAILQ_INSERT_AFTER(&tty_list, tp, &marker, t_list);
2909 if (tp->t_state & TS_MARKER)
2913 t.t_dev = (cdev_t)(uintptr_t)devid_from_dev(t.t_dev);
2914 error = SYSCTL_OUT(req, (caddr_t)&t, sizeof(t));
2918 TAILQ_REMOVE(&tty_list, &marker, t_list);
2919 lwkt_reltoken(&tty_token);
2923 SYSCTL_PROC(_kern, OID_AUTO, ttys, CTLTYPE_OPAQUE|CTLFLAG_RD,
2924 0, 0, sysctl_kern_ttys, "S,tty", "All struct ttys");
2927 nottystop(struct tty *tp, int rw)
2933 ttyread(struct dev_read_args *ap)
2938 tp = ap->a_head.a_dev->si_tty;
2941 lwkt_gettoken(&tp->t_token);
2942 ret = ((*linesw[tp->t_line].l_read)(tp, ap->a_uio, ap->a_ioflag));
2943 lwkt_reltoken(&tp->t_token);
2949 ttywrite(struct dev_write_args *ap)
2954 tp = ap->a_head.a_dev->si_tty;
2957 lwkt_gettoken(&tp->t_token);
2958 ret = ((*linesw[tp->t_line].l_write)(tp, ap->a_uio, ap->a_ioflag));
2959 lwkt_reltoken(&tp->t_token);