Lines Matching refs:tp

72 static void tty_rel_free(struct tty *tp);
96 #define TTY_CALLOUT(tp,d) (dev2unit(d) & TTYUNIT_CALLOUT)
115 tty_watermarks(struct tty *tp)
121 if (tp->t_termios.c_cflag & CREAD)
122 bs = MIN(tp->t_termios.c_ispeed / 5, TTYBUF_MAX);
123 error = ttyinq_setsize(&tp->t_inq, tp, bs);
128 tp->t_inlow = (ttyinq_getallocatedsize(&tp->t_inq) * 9) / 10;
131 bs = MIN(tp->t_termios.c_ospeed / 5, TTYBUF_MAX);
132 error = ttyoutq_setsize(&tp->t_outq, tp, bs);
137 tp->t_outlow = (ttyoutq_getallocatedsize(&tp->t_outq) * 9) / 10;
143 tty_drain(struct tty *tp, int leaving)
149 if (ttyhook_hashook(tp, getc_inject))
160 else if (tp->t_drainwait != 0)
161 timeout_at = getsbinuptime() + SBT_1S * tp->t_drainwait;
174 bytes = ttyoutq_bytesused(&tp->t_outq);
176 if (ttyoutq_bytesused(&tp->t_outq) == 0 && !ttydevsw_busy(tp))
180 ttydevsw_outwakeup(tp);
181 error = tty_timedwait(tp, &tp->t_outwait, hz / 10);
186 else if (leaving && ttyoutq_bytesused(&tp->t_outq) < bytes) {
190 bytes = ttyoutq_bytesused(&tp->t_outq);
205 ttydev_enter(struct tty *tp)
208 tty_lock(tp);
210 if (tty_gone(tp) || !tty_opened(tp)) {
212 tty_unlock(tp);
220 ttydev_leave(struct tty *tp)
223 tty_lock_assert(tp, MA_OWNED);
225 if (tty_opened(tp) || tp->t_flags & TF_OPENCLOSE) {
227 tty_unlock(tp);
231 tp->t_flags |= TF_OPENCLOSE;
234 if (constty == tp)
238 if (!tty_gone(tp))
239 tty_drain(tp, 1);
241 ttydisc_close(tp);
244 ttyinq_free(&tp->t_inq);
245 tp->t_inlow = 0;
246 ttyoutq_free(&tp->t_outq);
247 tp->t_outlow = 0;
249 knlist_clear(&tp->t_inpoll.si_note, 1);
250 knlist_clear(&tp->t_outpoll.si_note, 1);
252 if (!tty_gone(tp))
253 ttydevsw_close(tp);
255 tp->t_flags &= ~TF_OPENCLOSE;
256 cv_broadcast(&tp->t_dcdwait);
257 tty_rel_free(tp);
267 struct tty *tp;
270 tp = dev->si_drv1;
272 tty_lock(tp);
273 if (tty_gone(tp)) {
275 tty_unlock(tp);
283 while (tp->t_flags & TF_OPENCLOSE) {
284 error = tty_wait(tp, &tp->t_dcdwait);
286 tty_unlock(tp);
290 tp->t_flags |= TF_OPENCLOSE;
296 if (TTY_CALLOUT(tp, dev)) {
297 if (tp->t_flags & (TF_OPENED_CONS | TF_OPENED_IN)) {
302 if (tp->t_flags & TF_OPENED_OUT) {
308 if (tp->t_flags & TF_EXCLUDE && priv_check(td, PRIV_TTY_EXCLUSIVE)) {
313 if (!tty_opened(tp)) {
315 if (TTY_CALLOUT(tp, dev))
316 tp->t_termios = tp->t_termios_init_out;
318 tp->t_termios = tp->t_termios_init_in;
319 ttydevsw_param(tp, &tp->t_termios);
321 if (TTY_CALLOUT(tp, dev) || dev == dev_console)
322 tp->t_termios.c_cflag |= CLOCAL;
324 ttydevsw_modem(tp, SER_DTR|SER_RTS, 0);
326 error = ttydevsw_open(tp);
330 ttydisc_open(tp);
331 error = tty_watermarks(tp);
338 (tp->t_termios.c_cflag & CLOCAL) == 0) {
339 while ((ttydevsw_modem(tp, 0, 0) & SER_DCD) == 0) {
340 error = tty_wait(tp, &tp->t_dcdwait);
347 tp->t_flags |= TF_OPENED_CONS;
348 else if (TTY_CALLOUT(tp, dev))
349 tp->t_flags |= TF_OPENED_OUT;
351 tp->t_flags |= TF_OPENED_IN;
352 MPASS((tp->t_flags & (TF_OPENED_CONS | TF_OPENED_IN)) == 0 ||
353 (tp->t_flags & TF_OPENED_OUT) == 0);
355 done: tp->t_flags &= ~TF_OPENCLOSE;
356 cv_broadcast(&tp->t_dcdwait);
357 ttydev_leave(tp);
366 struct tty *tp = dev->si_drv1;
368 tty_lock(tp);
374 MPASS((tp->t_flags & (TF_OPENED_CONS | TF_OPENED_IN)) == 0 ||
375 (tp->t_flags & TF_OPENED_OUT) == 0);
377 tp->t_flags &= ~TF_OPENED_CONS;
379 tp->t_flags &= ~(TF_OPENED_IN|TF_OPENED_OUT);
381 if (tp->t_flags & TF_OPENED) {
382 tty_unlock(tp);
388 tty_flush(tp, FWRITE);
390 tp->t_flags &= ~TF_EXCLUDE;
393 tp->t_revokecnt++;
394 tty_wakeup(tp, FREAD|FWRITE);
395 cv_broadcast(&tp->t_bgwait);
396 cv_broadcast(&tp->t_dcdwait);
398 ttydev_leave(tp);
404 tty_is_ctty(struct tty *tp, struct proc *p)
407 tty_lock_assert(tp, MA_OWNED);
409 return (p->p_session == tp->t_session && p->p_flag & P_CONTROLT);
413 tty_wait_background(struct tty *tp, struct thread *td, int sig)
421 tty_lock_assert(tp, MA_OWNED);
434 if (!tty_is_ctty(tp, p) || p->p_pgrp == tp->t_pgrp) {
469 error = tty_wait(tp, &tp->t_bgwait);
478 struct tty *tp = dev->si_drv1;
481 error = ttydev_enter(tp);
484 error = ttydisc_read(tp, uio, ioflag);
485 tty_unlock(tp);
499 struct tty *tp = dev->si_drv1;
502 error = ttydev_enter(tp);
506 if (tp->t_termios.c_lflag & TOSTOP) {
507 error = tty_wait_background(tp, curthread, SIGTTOU);
512 if (ioflag & IO_NDELAY && tp->t_flags & TF_BUSY_OUT) {
514 error = ttydisc_write(tp, uio, ioflag);
517 while (tp->t_flags & TF_BUSY_OUT) {
518 error = tty_wait(tp, &tp->t_outserwait);
523 tp->t_flags |= TF_BUSY_OUT;
524 error = ttydisc_write(tp, uio, ioflag);
525 tp->t_flags &= ~TF_BUSY_OUT;
526 cv_signal(&tp->t_outserwait);
529 done: tty_unlock(tp);
537 struct tty *tp = dev->si_drv1;
540 error = ttydev_enter(tp);
580 error = tty_wait_background(tp, curthread, SIGTTOU);
586 struct termios *old = &tp->t_termios;
588 struct termios *lock = TTY_CALLOUT(tp, dev) ?
589 &tp->t_termios_lock_out : &tp->t_termios_lock_in;
613 error = tty_ioctl(tp, cmd, data, fflag, td);
614 done: tty_unlock(tp);
622 struct tty *tp = dev->si_drv1;
625 error = ttydev_enter(tp);
631 if (ttydisc_read_poll(tp) > 0)
635 if (tp->t_flags & TF_ZOMBIE) {
640 if (ttydisc_write_poll(tp) > 0)
646 selrecord(td, &tp->t_inpoll);
648 selrecord(td, &tp->t_outpoll);
651 tty_unlock(tp);
660 struct tty *tp = dev->si_drv1;
665 error = ttydev_enter(tp);
668 error = ttydevsw_mmap(tp, offset, paddr, nprot, memattr);
669 tty_unlock(tp);
681 struct tty *tp = kn->kn_hook;
683 knlist_remove(&tp->t_inpoll.si_note, kn, 0);
689 struct tty *tp = kn->kn_hook;
691 tty_lock_assert(tp, MA_OWNED);
693 if (tty_gone(tp) || tp->t_flags & TF_ZOMBIE) {
697 kn->kn_data = ttydisc_read_poll(tp);
705 struct tty *tp = kn->kn_hook;
707 knlist_remove(&tp->t_outpoll.si_note, kn, 0);
713 struct tty *tp = kn->kn_hook;
715 tty_lock_assert(tp, MA_OWNED);
717 if (tty_gone(tp)) {
721 kn->kn_data = ttydisc_write_poll(tp);
741 struct tty *tp = dev->si_drv1;
744 error = ttydev_enter(tp);
750 kn->kn_hook = tp;
752 knlist_add(&tp->t_inpoll.si_note, kn, 1);
755 kn->kn_hook = tp;
757 knlist_add(&tp->t_outpoll.si_note, kn, 1);
764 tty_unlock(tp);
790 struct tty *tp;
793 tp = dev->si_drv1;
795 tty_lock(tp);
796 if (tty_gone(tp))
798 tty_unlock(tp);
823 struct tty *tp = dev->si_drv1;
826 tty_lock(tp);
827 if (tty_gone(tp)) {
832 error = ttydevsw_cioctl(tp, dev2unit(dev), cmd, data, td);
859 done: tty_unlock(tp);
875 tty_init_termios(struct tty *tp)
877 struct termios *t = &tp->t_termios_init_in;
887 tp->t_termios_init_out = *t;
891 tty_init_console(struct tty *tp, speed_t s)
893 struct termios *ti = &tp->t_termios_init_in;
894 struct termios *to = &tp->t_termios_init_out;
912 ttydevsw_defopen(struct tty *tp __unused)
919 ttydevsw_defclose(struct tty *tp __unused)
925 ttydevsw_defoutwakeup(struct tty *tp __unused)
932 ttydevsw_definwakeup(struct tty *tp __unused)
938 ttydevsw_defioctl(struct tty *tp __unused, u_long cmd __unused,
946 ttydevsw_defcioctl(struct tty *tp __unused, int unit __unused,
954 ttydevsw_defparam(struct tty *tp __unused, struct termios *t)
976 ttydevsw_defmodem(struct tty *tp __unused, int sigon __unused,
985 ttydevsw_defmmap(struct tty *tp __unused, vm_ooffset_t offset __unused,
994 ttydevsw_defpktnotify(struct tty *tp __unused, char event __unused)
1007 ttydevsw_defbusy(struct tty *tp __unused)
1029 struct tty *tp;
1050 tp = malloc(sizeof(struct tty), M_TTY, M_WAITOK|M_ZERO);
1051 tp->t_devsw = tsw;
1052 tp->t_devswsoftc = sc;
1053 tp->t_flags = tsw->tsw_flags;
1054 tp->t_drainwait = tty_drainwait;
1056 tty_init_termios(tp);
1058 cv_init(&tp->t_inwait, "ttyin");
1059 cv_init(&tp->t_outwait, "ttyout");
1060 cv_init(&tp->t_outserwait, "ttyosr");
1061 cv_init(&tp->t_bgwait, "ttybg");
1062 cv_init(&tp->t_dcdwait, "ttydcd");
1066 tp->t_mtx = mutex;
1068 tp->t_mtx = &tp->t_mtxobj;
1069 mtx_init(&tp->t_mtxobj, "ttymtx", NULL, MTX_DEF);
1072 knlist_init_mtx(&tp->t_inpoll.si_note, tp->t_mtx);
1073 knlist_init_mtx(&tp->t_outpoll.si_note, tp->t_mtx);
1075 return (tp);
1081 struct tty *tp = arg;
1090 ttyinq_free(&tp->t_inq);
1091 ttyoutq_free(&tp->t_outq);
1092 seldrain(&tp->t_inpoll);
1093 seldrain(&tp->t_outpoll);
1094 knlist_destroy(&tp->t_inpoll.si_note);
1095 knlist_destroy(&tp->t_outpoll.si_note);
1097 cv_destroy(&tp->t_inwait);
1098 cv_destroy(&tp->t_outwait);
1099 cv_destroy(&tp->t_bgwait);
1100 cv_destroy(&tp->t_dcdwait);
1101 cv_destroy(&tp->t_outserwait);
1103 if (tp->t_mtx == &tp->t_mtxobj)
1104 mtx_destroy(&tp->t_mtxobj);
1105 ttydevsw_free(tp);
1106 free(tp, M_TTY);
1110 tty_rel_free(struct tty *tp)
1114 tty_lock_assert(tp, MA_OWNED);
1117 if (tp->t_sessioncnt != 0 || (tp->t_flags & TF_ACTIVITY) != TF_GONE) {
1119 tty_unlock(tp);
1124 funsetown(&tp->t_sigio);
1127 dev = tp->t_dev;
1128 tp->t_dev = NULL;
1129 tty_unlock(tp);
1133 TAILQ_REMOVE(&tty_list, tp, t_list);
1136 destroy_dev_sched_cb(dev, tty_dealloc, tp);
1141 tty_rel_pgrp(struct tty *tp, struct pgrp *pg)
1144 MPASS(tp->t_sessioncnt > 0);
1145 tty_lock_assert(tp, MA_OWNED);
1147 if (tp->t_pgrp == pg)
1148 tp->t_pgrp = NULL;
1150 tty_unlock(tp);
1154 tty_rel_sess(struct tty *tp, struct session *sess)
1157 MPASS(tp->t_sessioncnt > 0);
1160 if (tp->t_session == sess) {
1161 tp->t_session = NULL;
1162 MPASS(tp->t_pgrp == NULL);
1164 tp->t_sessioncnt--;
1165 tty_rel_free(tp);
1169 tty_rel_gone(struct tty *tp)
1172 tty_lock_assert(tp, MA_OWNED);
1173 MPASS(!tty_gone(tp));
1176 ttydisc_modem(tp, 0);
1179 tty_wakeup(tp, FREAD|FWRITE);
1180 cv_broadcast(&tp->t_bgwait);
1181 cv_broadcast(&tp->t_dcdwait);
1183 tp->t_flags |= TF_GONE;
1184 tty_rel_free(tp);
1188 tty_drop_ctty(struct tty *tp, struct proc *p)
1201 tty_unlock(tp);
1203 tty_lock(tp);
1204 if (tty_gone(tp)) {
1215 if (session->s_ttyp == NULL || session->s_ttyp != tp) {
1233 tp->t_sessioncnt--;
1257 tty_to_xtty(struct tty *tp, struct xtty *xt)
1260 tty_lock_assert(tp, MA_OWNED);
1263 xt->xt_insize = ttyinq_getsize(&tp->t_inq);
1264 xt->xt_incc = ttyinq_bytescanonicalized(&tp->t_inq);
1265 xt->xt_inlc = ttyinq_bytesline(&tp->t_inq);
1266 xt->xt_inlow = tp->t_inlow;
1267 xt->xt_outsize = ttyoutq_getsize(&tp->t_outq);
1268 xt->xt_outcc = ttyoutq_bytesused(&tp->t_outq);
1269 xt->xt_outlow = tp->t_outlow;
1270 xt->xt_column = tp->t_column;
1271 xt->xt_pgid = tp->t_pgrp ? tp->t_pgrp->pg_id : 0;
1272 xt->xt_sid = tp->t_session ? tp->t_session->s_sid : 0;
1273 xt->xt_flags = tp->t_flags;
1274 xt->xt_dev = tp->t_dev ? dev2udev(tp->t_dev) : NODEV;
1282 struct tty *tp;
1294 TAILQ_FOREACH(tp, &tty_list, t_list) {
1295 tty_lock(tp);
1296 tty_to_xtty(tp, xt);
1297 tty_unlock(tp);
1316 tty_makedevf(struct tty *tp, struct ucred *cred, int flags,
1330 if (tp->t_flags & TF_NOPREFIX)
1360 args.mda_si_drv1 = tp;
1364 tp->t_dev = dev;
1369 if (tp->t_flags & TF_INITLOCK) {
1372 args.mda_si_drv1 = tp;
1373 args.mda_si_drv2 = &tp->t_termios_init_in;
1380 args.mda_si_drv2 = &tp->t_termios_lock_in;
1388 if (tp->t_flags & TF_CALLOUT) {
1397 args.mda_si_drv1 = tp;
1404 if (tp->t_flags & TF_INITLOCK) {
1407 args.mda_si_drv2 = &tp->t_termios_init_out;
1414 args.mda_si_drv2 = &tp->t_termios_lock_out;
1423 TAILQ_INSERT_TAIL(&tty_list, tp, t_list);
1448 tty_signal_sessleader(struct tty *tp, int sig)
1452 tty_lock_assert(tp, MA_OWNED);
1456 tp->t_flags &= ~TF_STOPPED;
1458 if (tp->t_session != NULL && tp->t_session->s_leader != NULL) {
1459 p = tp->t_session->s_leader;
1467 tty_signal_pgrp(struct tty *tp, int sig)
1471 tty_lock_assert(tp, MA_OWNED);
1475 tp->t_flags &= ~TF_STOPPED;
1477 if (sig == SIGINFO && !(tp->t_termios.c_lflag & NOKERNINFO))
1478 tty_info(tp);
1479 if (tp->t_pgrp != NULL) {
1483 PGRP_LOCK(tp->t_pgrp);
1484 pgsignal(tp->t_pgrp, sig, 1, &ksi);
1485 PGRP_UNLOCK(tp->t_pgrp);
1490 tty_wakeup(struct tty *tp, int flags)
1493 if (tp->t_flags & TF_ASYNC && tp->t_sigio != NULL)
1494 pgsigio(&tp->t_sigio, SIGIO, (tp->t_session != NULL));
1497 cv_broadcast(&tp->t_outwait);
1498 selwakeup(&tp->t_outpoll);
1499 KNOTE_LOCKED(&tp->t_outpoll.si_note, 0);
1502 cv_broadcast(&tp->t_inwait);
1503 selwakeup(&tp->t_inpoll);
1504 KNOTE_LOCKED(&tp->t_inpoll.si_note, 0);
1509 tty_wait(struct tty *tp, struct cv *cv)
1512 int revokecnt = tp->t_revokecnt;
1514 tty_lock_assert(tp, MA_OWNED|MA_NOTRECURSED);
1515 MPASS(!tty_gone(tp));
1517 error = cv_wait_sig(cv, tp->t_mtx);
1520 if (tty_gone(tp))
1524 if (tp->t_revokecnt != revokecnt)
1531 tty_timedwait(struct tty *tp, struct cv *cv, int hz)
1534 int revokecnt = tp->t_revokecnt;
1536 tty_lock_assert(tp, MA_OWNED|MA_NOTRECURSED);
1537 MPASS(!tty_gone(tp));
1539 error = cv_timedwait_sig(cv, tp->t_mtx, hz);
1542 if (tty_gone(tp))
1546 if (tp->t_revokecnt != revokecnt)
1553 tty_flush(struct tty *tp, int flags)
1557 tp->t_flags &= ~TF_HIWAT_OUT;
1558 ttyoutq_flush(&tp->t_outq);
1559 tty_wakeup(tp, FWRITE);
1560 if (!tty_gone(tp)) {
1561 ttydevsw_outwakeup(tp);
1562 ttydevsw_pktnotify(tp, TIOCPKT_FLUSHWRITE);
1566 tty_hiwat_in_unblock(tp);
1567 ttyinq_flush(&tp->t_inq);
1568 tty_wakeup(tp, FREAD);
1569 if (!tty_gone(tp)) {
1570 ttydevsw_inwakeup(tp);
1571 ttydevsw_pktnotify(tp, TIOCPKT_FLUSHREAD);
1577 tty_set_winsize(struct tty *tp, const struct winsize *wsz)
1580 if (memcmp(&tp->t_winsize, wsz, sizeof(*wsz)) == 0)
1582 tp->t_winsize = *wsz;
1583 tty_signal_pgrp(tp, SIGWINCH);
1587 tty_generic_ioctl(struct tty *tp, u_long cmd, void *data, int fflag,
1599 ttydevsw_modem(tp, SER_DTR, 0);
1602 ttydevsw_modem(tp, 0, SER_DTR);
1606 ttydevsw_modem(tp,
1613 ttydevsw_modem(tp, (bits & (TIOCM_DTR | TIOCM_RTS)) >> 1, 0);
1618 ttydevsw_modem(tp, 0, (bits & (TIOCM_DTR | TIOCM_RTS)) >> 1);
1622 *(int *)data = TIOCM_LE + (ttydevsw_modem(tp, 0, 0) << 1);
1627 tp->t_flags |= TF_ASYNC;
1629 tp->t_flags &= ~TF_ASYNC;
1635 *(int *)data = ttyinq_bytescanonicalized(&tp->t_inq);
1639 *(int *)data = ttyoutq_bytesused(&tp->t_outq);
1642 if (tp->t_session != NULL && !tty_is_ctty(tp, td->td_proc))
1647 tty_unlock(tp);
1648 error = fsetown(*(int *)data, &tp->t_sigio);
1649 tty_lock(tp);
1652 if (tp->t_session != NULL && !tty_is_ctty(tp, td->td_proc))
1657 *(int *)data = fgetown(&tp->t_sigio);
1661 *(struct termios*)data = tp->t_termios;
1684 error = tty_drain(tp, 0);
1688 tty_flush(tp, FREAD);
1695 (tp->t_termios.c_cflag != t->c_cflag ||
1696 ((tp->t_termios.c_iflag ^ t->c_iflag) &
1698 tp->t_termios.c_ispeed != t->c_ispeed ||
1699 tp->t_termios.c_ospeed != t->c_ospeed)) {
1700 error = ttydevsw_param(tp, t);
1706 tp->t_termios.c_cflag = t->c_cflag & ~CIGNORE;
1707 tp->t_termios.c_ispeed = t->c_ispeed;
1708 tp->t_termios.c_ospeed = t->c_ospeed;
1711 error = tty_watermarks(tp);
1717 tp->t_termios.c_iflag = t->c_iflag;
1718 tp->t_termios.c_oflag = t->c_oflag;
1719 tp->t_termios.c_lflag = t->c_lflag;
1720 memcpy(&tp->t_termios.c_cc, t->c_cc, sizeof t->c_cc);
1722 ttydisc_optimize(tp);
1730 ttyinq_canonicalize(&tp->t_inq);
1731 tty_wakeup(tp, FREAD);
1738 if (tp->t_termios.c_iflag & IXON &&
1739 tp->t_termios.c_cc[VSTOP] == CTRL('S') &&
1740 tp->t_termios.c_cc[VSTART] == CTRL('Q'))
1741 ttydevsw_pktnotify(tp, TIOCPKT_DOSTOP);
1743 ttydevsw_pktnotify(tp, TIOCPKT_NOSTOP);
1751 if (!tty_is_ctty(tp, td->td_proc))
1754 if (tp->t_pgrp != NULL)
1755 *(int *)data = tp->t_pgrp->pg_id;
1760 if (!tty_is_ctty(tp, td->td_proc))
1763 MPASS(tp->t_session);
1764 *(int *)data = tp->t_session->s_sid;
1767 return (tty_drop_ctty(tp, td->td_proc));
1772 tty_unlock(tp);
1774 tty_lock(tp);
1782 if (tp->t_session != NULL && tp->t_session == p->p_session) {
1789 (tp->t_session != NULL && tp->t_session->s_ttyvp != NULL &&
1790 tp->t_session->s_ttyvp->v_type != VBAD)) {
1807 tp->t_session = p->p_session;
1808 tp->t_session->s_ttyp = tp;
1809 tp->t_sessioncnt++;
1812 tp->t_pgrp = p->p_pgrp;
1828 tty_unlock(tp);
1835 tty_lock(tp);
1838 tty_lock(tp);
1844 if (!tty_is_ctty(tp, td->td_proc)) {
1848 tp->t_pgrp = pg;
1852 cv_broadcast(&tp->t_bgwait);
1862 tty_flush(tp, flags);
1867 return tty_drain(tp, 0);
1869 *(int *)data = tp->t_drainwait;
1874 tp->t_drainwait = *(int *)data;
1888 if (constty == tp)
1893 tty_unlock(tp);
1894 constty_set(tp);
1895 tty_lock(tp);
1896 } else if (constty == tp) {
1902 *(struct winsize*)data = tp->t_winsize;
1906 tty_set_winsize(tp, data);
1909 tp->t_flags |= TF_EXCLUDE;
1912 tp->t_flags &= ~TF_EXCLUDE;
1915 tp->t_flags |= TF_STOPPED;
1916 ttydevsw_pktnotify(tp, TIOCPKT_STOP);
1919 tp->t_flags &= ~TF_STOPPED;
1920 ttydevsw_outwakeup(tp);
1921 ttydevsw_pktnotify(tp, TIOCPKT_START);
1924 tty_info(tp);
1929 if (!tty_is_ctty(tp, td->td_proc) &&
1932 ttydisc_rint(tp, *(char *)data, 0);
1933 ttydisc_rint_done(tp);
1938 return tty_ioctl_compat(tp, cmd, data, fflag, td);
1945 tty_ioctl(struct tty *tp, u_long cmd, void *data, int fflag, struct thread *td)
1949 tty_lock_assert(tp, MA_OWNED);
1951 if (tty_gone(tp))
1954 error = ttydevsw_ioctl(tp, cmd, data, td);
1956 error = tty_generic_ioctl(tp, cmd, data, fflag, td);
1962 tty_udev(struct tty *tp)
1965 if (tp->t_dev)
1966 return (dev2udev(tp->t_dev));
1972 tty_checkoutq(struct tty *tp)
1976 return (ttyoutq_bytesleft(&tp->t_outq) >= 256);
1980 tty_hiwat_in_block(struct tty *tp)
1983 if ((tp->t_flags & TF_HIWAT_IN) == 0 &&
1984 tp->t_termios.c_iflag & IXOFF &&
1985 tp->t_termios.c_cc[VSTOP] != _POSIX_VDISABLE) {
1990 if (ttyoutq_write_nofrag(&tp->t_outq,
1991 &tp->t_termios.c_cc[VSTOP], 1) == 0)
1992 tp->t_flags |= TF_HIWAT_IN;
1995 tp->t_flags |= TF_HIWAT_IN;
2000 tty_hiwat_in_unblock(struct tty *tp)
2003 if (tp->t_flags & TF_HIWAT_IN &&
2004 tp->t_termios.c_iflag & IXOFF &&
2005 tp->t_termios.c_cc[VSTART] != _POSIX_VDISABLE) {
2010 if (ttyoutq_write_nofrag(&tp->t_outq,
2011 &tp->t_termios.c_cc[VSTART], 1) == 0)
2012 tp->t_flags &= ~TF_HIWAT_IN;
2015 tp->t_flags &= ~TF_HIWAT_IN;
2018 if (!tty_gone(tp))
2019 ttydevsw_inwakeup(tp);
2027 ttyhook_defrint(struct tty *tp, char c, int flags)
2030 if (ttyhook_rint_bypass(tp, &c, 1) != 1)
2040 struct tty *tp;
2084 tp = dev->si_drv1;
2088 tty_lock(tp);
2089 MPASS((tp->t_hook == NULL) == ((tp->t_flags & TF_HOOK) == 0));
2090 if (tp->t_flags & TF_HOOK)
2093 tp->t_flags |= TF_HOOK;
2094 tp->t_hook = th;
2095 tp->t_hooksoftc = softc;
2096 *rtp = tp;
2100 ttydisc_optimize(tp);
2103 if (!ttyhook_hashook(tp, rint) && ttyhook_hashook(tp, rint_bypass))
2106 done3: tty_unlock(tp);
2113 ttyhook_unregister(struct tty *tp)
2116 tty_lock_assert(tp, MA_OWNED);
2117 MPASS(tp->t_flags & TF_HOOK);
2120 tp->t_flags &= ~TF_HOOK;
2121 tp->t_hook = NULL;
2124 ttydisc_optimize(tp);
2127 tty_rel_free(tp);
2137 struct tty *tp;
2145 TAILQ_FOREACH(tp, &tty_list, t_list) {
2146 if (strcmp(dev_console_filename, tty_devname(tp)) == 0) {
2147 dev_console->si_drv1 = tp;
2317 struct tty *tp;
2323 tp = (struct tty *)addr;
2325 db_printf("%p: %s\n", tp, tty_devname(tp));
2326 db_printf("\tmtx: %p\n", tp->t_mtx);
2327 db_printf("\tflags: 0x%b\n", tp->t_flags, TTY_FLAG_BITS);
2328 db_printf("\trevokecnt: %u\n", tp->t_revokecnt);
2332 "nblocks %u quota %u\n", &tp->t_inq, tp->t_inq.ti_begin,
2333 tp->t_inq.ti_linestart, tp->t_inq.ti_reprint, tp->t_inq.ti_end,
2334 tp->t_inq.ti_nblocks, tp->t_inq.ti_quota);
2336 &tp->t_outq, tp->t_outq.to_begin, tp->t_outq.to_end,
2337 tp->t_outq.to_nblocks, tp->t_outq.to_quota);
2338 db_printf("\tinlow: %zu\n", tp->t_inlow);
2339 db_printf("\toutlow: %zu\n", tp->t_outlow);
2340 _db_show_termios("\ttermios", &tp->t_termios);
2342 tp->t_winsize.ws_row, tp->t_winsize.ws_col,
2343 tp->t_winsize.ws_xpixel, tp->t_winsize.ws_ypixel);
2344 db_printf("\tcolumn: %u\n", tp->t_column);
2345 db_printf("\twritepos: %u\n", tp->t_writepos);
2346 db_printf("\tcompatflags: 0x%x\n", tp->t_compatflags);
2349 _db_show_termios("\ttermios_init_in", &tp->t_termios_init_in);
2350 _db_show_termios("\ttermios_init_out", &tp->t_termios_init_out);
2351 _db_show_termios("\ttermios_lock_in", &tp->t_termios_lock_in);
2352 _db_show_termios("\ttermios_lock_out", &tp->t_termios_lock_out);
2355 _db_show_devsw("\t", tp->t_devsw);
2356 _db_show_hooks("\t", tp->t_hook);
2359 db_printf("\tpgrp: %p gid %d jobc %d\n", tp->t_pgrp,
2360 tp->t_pgrp ? tp->t_pgrp->pg_id : 0,
2361 tp->t_pgrp ? tp->t_pgrp->pg_jobc : 0);
2362 db_printf("\tsession: %p", tp->t_session);
2363 if (tp->t_session != NULL)
2365 tp->t_session->s_count, tp->t_session->s_leader,
2366 tp->t_session->s_ttyp, tp->t_session->s_sid,
2367 tp->t_session->s_login);
2369 db_printf("\tsessioncnt: %u\n", tp->t_sessioncnt);
2370 db_printf("\tdevswsoftc: %p\n", tp->t_devswsoftc);
2371 db_printf("\thooksoftc: %p\n", tp->t_hooksoftc);
2372 db_printf("\tdev: %p\n", tp->t_dev);
2378 struct tty *tp;
2390 TAILQ_FOREACH(tp, &tty_list, t_list) {
2391 isiz = tp->t_inq.ti_nblocks * TTYINQ_DATASIZE;
2392 osiz = tp->t_outq.to_nblocks * TTYOUTQ_DATASIZE;
2395 "%5d ", tp, tty_devname(tp), isiz,
2396 tp->t_inq.ti_linestart - tp->t_inq.ti_begin,
2397 tp->t_inq.ti_end - tp->t_inq.ti_linestart,
2398 isiz - tp->t_inlow, osiz,
2399 tp->t_outq.to_end - tp->t_outq.to_begin,
2400 osiz - tp->t_outlow, MIN(tp->t_column, 99999),
2401 tp->t_session ? tp->t_session->s_sid : 0,
2402 tp->t_pgrp ? tp->t_pgrp->pg_id : 0);
2406 if (tp->t_flags & ttystates[i].flag) {