Lines Matching refs:tp
75 static void tty_rel_free(struct tty *tp);
99 #define TTY_CALLOUT(tp,d) (dev2unit(d) & TTYUNIT_CALLOUT) argument
124 tty_watermarks(struct tty *tp) in tty_watermarks() argument
130 if (tp->t_termios.c_cflag & CREAD) in tty_watermarks()
131 bs = MIN(tp->t_termios.c_ispeed / 5, TTYBUF_MAX); in tty_watermarks()
132 error = ttyinq_setsize(&tp->t_inq, tp, bs); in tty_watermarks()
137 tp->t_inlow = (ttyinq_getallocatedsize(&tp->t_inq) * 9) / 10; in tty_watermarks()
140 bs = MIN(tp->t_termios.c_ospeed / 5, TTYBUF_MAX); in tty_watermarks()
141 error = ttyoutq_setsize(&tp->t_outq, tp, bs); in tty_watermarks()
146 tp->t_outlow = (ttyoutq_getallocatedsize(&tp->t_outq) * 9) / 10; in tty_watermarks()
152 tty_drain(struct tty *tp, int leaving) in tty_drain() argument
158 if (ttyhook_hashook(tp, getc_inject)) in tty_drain()
169 else if (tp->t_drainwait != 0) in tty_drain()
170 timeout_at = getsbinuptime() + SBT_1S * tp->t_drainwait; in tty_drain()
183 bytes = ttyoutq_bytesused(&tp->t_outq); in tty_drain()
185 if (ttyoutq_bytesused(&tp->t_outq) == 0 && !ttydevsw_busy(tp)) in tty_drain()
189 ttydevsw_outwakeup(tp); in tty_drain()
190 error = tty_timedwait(tp, &tp->t_outwait, hz / 10); in tty_drain()
195 else if (leaving && ttyoutq_bytesused(&tp->t_outq) < bytes) { in tty_drain()
199 bytes = ttyoutq_bytesused(&tp->t_outq); in tty_drain()
214 ttydev_enter(struct tty *tp) in ttydev_enter() argument
217 tty_lock(tp); in ttydev_enter()
219 if (tty_gone(tp) || !tty_opened(tp)) { in ttydev_enter()
221 tty_unlock(tp); in ttydev_enter()
229 ttydev_leave(struct tty *tp) in ttydev_leave() argument
232 tty_assert_locked(tp); in ttydev_leave()
234 if (tty_opened(tp) || tp->t_flags & TF_OPENCLOSE) { in ttydev_leave()
236 tty_unlock(tp); in ttydev_leave()
240 tp->t_flags |= TF_OPENCLOSE; in ttydev_leave()
243 constty_clear(tp); in ttydev_leave()
246 if (!tty_gone(tp)) in ttydev_leave()
247 tty_drain(tp, 1); in ttydev_leave()
249 ttydisc_close(tp); in ttydev_leave()
252 ttyinq_free(&tp->t_inq); in ttydev_leave()
253 tp->t_inlow = 0; in ttydev_leave()
254 ttyoutq_free(&tp->t_outq); in ttydev_leave()
255 tp->t_outlow = 0; in ttydev_leave()
257 if (!tty_gone(tp)) in ttydev_leave()
258 ttydevsw_close(tp); in ttydev_leave()
260 tp->t_flags &= ~TF_OPENCLOSE; in ttydev_leave()
261 cv_broadcast(&tp->t_dcdwait); in ttydev_leave()
262 tty_rel_free(tp); in ttydev_leave()
272 struct tty *tp; in ttydev_open() local
275 tp = dev->si_drv1; in ttydev_open()
277 tty_lock(tp); in ttydev_open()
278 if (tty_gone(tp)) { in ttydev_open()
280 tty_unlock(tp); in ttydev_open()
288 while (tp->t_flags & TF_OPENCLOSE) { in ttydev_open()
289 error = tty_wait(tp, &tp->t_dcdwait); in ttydev_open()
291 tty_unlock(tp); in ttydev_open()
295 tp->t_flags |= TF_OPENCLOSE; in ttydev_open()
301 if (TTY_CALLOUT(tp, dev)) { in ttydev_open()
302 if (tp->t_flags & (TF_OPENED_CONS | TF_OPENED_IN)) { in ttydev_open()
307 if (tp->t_flags & TF_OPENED_OUT) { in ttydev_open()
313 if (tp->t_flags & TF_EXCLUDE && priv_check(td, PRIV_TTY_EXCLUSIVE)) { in ttydev_open()
318 if (!tty_opened(tp)) { in ttydev_open()
320 if (TTY_CALLOUT(tp, dev)) in ttydev_open()
321 tp->t_termios = tp->t_termios_init_out; in ttydev_open()
323 tp->t_termios = tp->t_termios_init_in; in ttydev_open()
324 ttydevsw_param(tp, &tp->t_termios); in ttydev_open()
326 if (TTY_CALLOUT(tp, dev) || dev == dev_console) in ttydev_open()
327 tp->t_termios.c_cflag |= CLOCAL; in ttydev_open()
329 if ((tp->t_termios.c_cflag & CNO_RTSDTR) == 0) in ttydev_open()
330 ttydevsw_modem(tp, SER_DTR|SER_RTS, 0); in ttydev_open()
332 error = ttydevsw_open(tp); in ttydev_open()
336 ttydisc_open(tp); in ttydev_open()
337 error = tty_watermarks(tp); in ttydev_open()
344 (tp->t_termios.c_cflag & CLOCAL) == 0) { in ttydev_open()
345 while ((ttydevsw_modem(tp, 0, 0) & SER_DCD) == 0) { in ttydev_open()
346 error = tty_wait(tp, &tp->t_dcdwait); in ttydev_open()
353 tp->t_flags |= TF_OPENED_CONS; in ttydev_open()
354 else if (TTY_CALLOUT(tp, dev)) in ttydev_open()
355 tp->t_flags |= TF_OPENED_OUT; in ttydev_open()
357 tp->t_flags |= TF_OPENED_IN; in ttydev_open()
358 MPASS((tp->t_flags & (TF_OPENED_CONS | TF_OPENED_IN)) == 0 || in ttydev_open()
359 (tp->t_flags & TF_OPENED_OUT) == 0); in ttydev_open()
361 done: tp->t_flags &= ~TF_OPENCLOSE; in ttydev_open()
362 cv_broadcast(&tp->t_dcdwait); in ttydev_open()
363 ttydev_leave(tp); in ttydev_open()
372 struct tty *tp = dev->si_drv1; in ttydev_close() local
374 tty_lock(tp); in ttydev_close()
380 MPASS((tp->t_flags & (TF_OPENED_CONS | TF_OPENED_IN)) == 0 || in ttydev_close()
381 (tp->t_flags & TF_OPENED_OUT) == 0); in ttydev_close()
383 tp->t_flags &= ~TF_OPENED_CONS; in ttydev_close()
385 tp->t_flags &= ~(TF_OPENED_IN|TF_OPENED_OUT); in ttydev_close()
387 if (tp->t_flags & TF_OPENED) { in ttydev_close()
388 tty_unlock(tp); in ttydev_close()
394 tty_flush(tp, FWRITE); in ttydev_close()
395 knlist_delete(&tp->t_inpoll.si_note, td, 1); in ttydev_close()
396 knlist_delete(&tp->t_outpoll.si_note, td, 1); in ttydev_close()
399 tp->t_flags &= ~TF_EXCLUDE; in ttydev_close()
402 tp->t_revokecnt++; in ttydev_close()
403 tty_wakeup(tp, FREAD|FWRITE); in ttydev_close()
404 cv_broadcast(&tp->t_bgwait); in ttydev_close()
405 cv_broadcast(&tp->t_dcdwait); in ttydev_close()
407 ttydev_leave(tp); in ttydev_close()
413 tty_is_ctty(struct tty *tp, struct proc *p) in tty_is_ctty() argument
416 tty_assert_locked(tp); in tty_is_ctty()
418 return (p->p_session == tp->t_session && p->p_flag & P_CONTROLT); in tty_is_ctty()
422 tty_wait_background(struct tty *tp, struct thread *td, int sig) in tty_wait_background() argument
430 tty_assert_locked(tp); in tty_wait_background()
457 if (!tty_is_ctty(tp, p) || p->p_pgrp == tp->t_pgrp) { in tty_wait_background()
495 error = tty_wait(tp, &tp->t_bgwait); in tty_wait_background()
504 struct tty *tp = dev->si_drv1; in ttydev_read() local
507 error = ttydev_enter(tp); in ttydev_read()
510 error = ttydisc_read(tp, uio, ioflag); in ttydev_read()
511 tty_unlock(tp); in ttydev_read()
525 struct tty *tp = dev->si_drv1; in ttydev_write() local
528 error = ttydev_enter(tp); in ttydev_write()
532 if (tp->t_termios.c_lflag & TOSTOP) { in ttydev_write()
533 error = tty_wait_background(tp, curthread, SIGTTOU); in ttydev_write()
538 if (ioflag & IO_NDELAY && tp->t_flags & TF_BUSY_OUT) { in ttydev_write()
540 error = ttydisc_write(tp, uio, ioflag); in ttydev_write()
543 while (tp->t_flags & TF_BUSY_OUT) { in ttydev_write()
544 error = tty_wait(tp, &tp->t_outserwait); in ttydev_write()
549 tp->t_flags |= TF_BUSY_OUT; in ttydev_write()
551 error = ttydisc_write(tp, uio, ioflag); in ttydev_write()
553 tp->t_flags &= ~TF_BUSY_OUT; in ttydev_write()
554 cv_signal(&tp->t_outserwait); in ttydev_write()
557 done: tty_unlock(tp); in ttydev_write()
565 struct tty *tp = dev->si_drv1; in ttydev_ioctl() local
568 error = ttydev_enter(tp); in ttydev_ioctl()
608 error = tty_wait_background(tp, curthread, SIGTTOU); in ttydev_ioctl()
614 struct termios *old = &tp->t_termios; in ttydev_ioctl()
616 struct termios *lock = TTY_CALLOUT(tp, dev) ? in ttydev_ioctl()
617 &tp->t_termios_lock_out : &tp->t_termios_lock_in; in ttydev_ioctl()
641 error = tty_ioctl(tp, cmd, data, fflag, td); in ttydev_ioctl()
642 done: tty_unlock(tp); in ttydev_ioctl()
650 struct tty *tp = dev->si_drv1; in ttydev_poll() local
653 error = ttydev_enter(tp); in ttydev_poll()
659 if (ttydisc_read_poll(tp) > 0) in ttydev_poll()
663 if (tp->t_flags & TF_ZOMBIE) { in ttydev_poll()
668 if (ttydisc_write_poll(tp) > 0) in ttydev_poll()
674 selrecord(td, &tp->t_inpoll); in ttydev_poll()
676 selrecord(td, &tp->t_outpoll); in ttydev_poll()
679 tty_unlock(tp); in ttydev_poll()
688 struct tty *tp = dev->si_drv1; in ttydev_mmap() local
693 error = ttydev_enter(tp); in ttydev_mmap()
696 error = ttydevsw_mmap(tp, offset, paddr, nprot, memattr); in ttydev_mmap()
697 tty_unlock(tp); in ttydev_mmap()
709 struct tty *tp = kn->kn_hook; in tty_kqops_read_detach() local
711 knlist_remove(&tp->t_inpoll.si_note, kn, 0); in tty_kqops_read_detach()
717 struct tty *tp = kn->kn_hook; in tty_kqops_read_event() local
719 tty_assert_locked(tp); in tty_kqops_read_event()
721 if (tty_gone(tp) || tp->t_flags & TF_ZOMBIE) { in tty_kqops_read_event()
725 kn->kn_data = ttydisc_read_poll(tp); in tty_kqops_read_event()
733 struct tty *tp = kn->kn_hook; in tty_kqops_write_detach() local
735 knlist_remove(&tp->t_outpoll.si_note, kn, 0); in tty_kqops_write_detach()
741 struct tty *tp = kn->kn_hook; in tty_kqops_write_event() local
743 tty_assert_locked(tp); in tty_kqops_write_event()
745 if (tty_gone(tp)) { in tty_kqops_write_event()
749 kn->kn_data = ttydisc_write_poll(tp); in tty_kqops_write_event()
769 struct tty *tp = dev->si_drv1; in ttydev_kqfilter() local
772 error = ttydev_enter(tp); in ttydev_kqfilter()
778 kn->kn_hook = tp; in ttydev_kqfilter()
780 knlist_add(&tp->t_inpoll.si_note, kn, 1); in ttydev_kqfilter()
783 kn->kn_hook = tp; in ttydev_kqfilter()
785 knlist_add(&tp->t_outpoll.si_note, kn, 1); in ttydev_kqfilter()
792 tty_unlock(tp); in ttydev_kqfilter()
818 struct tty *tp; in ttyil_open() local
821 tp = dev->si_drv1; in ttyil_open()
823 tty_lock(tp); in ttyil_open()
824 if (tty_gone(tp)) in ttyil_open()
826 tty_unlock(tp); in ttyil_open()
851 struct tty *tp = dev->si_drv1; in ttyil_ioctl() local
854 tty_lock(tp); in ttyil_ioctl()
855 if (tty_gone(tp)) { in ttyil_ioctl()
860 error = ttydevsw_cioctl(tp, dev2unit(dev), cmd, data, td); in ttyil_ioctl()
887 done: tty_unlock(tp); in ttyil_ioctl()
903 tty_init_termios(struct tty *tp) in tty_init_termios() argument
905 struct termios *t = &tp->t_termios_init_in; in tty_init_termios()
915 tp->t_termios_init_out = *t; in tty_init_termios()
919 tty_init_console(struct tty *tp, speed_t s) in tty_init_console() argument
921 struct termios *ti = &tp->t_termios_init_in; in tty_init_console()
922 struct termios *to = &tp->t_termios_init_out; in tty_init_console()
940 ttydevsw_defopen(struct tty *tp __unused) in ttydevsw_defopen()
947 ttydevsw_defclose(struct tty *tp __unused) in ttydevsw_defclose()
953 ttydevsw_defoutwakeup(struct tty *tp __unused) in ttydevsw_defoutwakeup()
960 ttydevsw_definwakeup(struct tty *tp __unused) in ttydevsw_definwakeup()
966 ttydevsw_defioctl(struct tty *tp __unused, u_long cmd __unused, in ttydevsw_defioctl()
974 ttydevsw_defcioctl(struct tty *tp __unused, int unit __unused, in ttydevsw_defcioctl()
982 ttydevsw_defparam(struct tty *tp __unused, struct termios *t) in ttydevsw_defparam()
1004 ttydevsw_defmodem(struct tty *tp __unused, int sigon __unused, in ttydevsw_defmodem()
1013 ttydevsw_defmmap(struct tty *tp __unused, vm_ooffset_t offset __unused, in ttydevsw_defmmap()
1022 ttydevsw_defpktnotify(struct tty *tp __unused, char event __unused) in ttydevsw_defpktnotify()
1035 ttydevsw_defbusy(struct tty *tp __unused) in ttydevsw_defbusy()
1057 struct tty *tp; in tty_alloc_mutex() local
1078 tp = malloc(sizeof(struct tty) + TTY_PRBUF_SIZE, M_TTY, in tty_alloc_mutex()
1080 tp->t_prbufsz = TTY_PRBUF_SIZE; in tty_alloc_mutex()
1081 tp->t_devsw = tsw; in tty_alloc_mutex()
1082 tp->t_devswsoftc = sc; in tty_alloc_mutex()
1083 tp->t_flags = tsw->tsw_flags; in tty_alloc_mutex()
1084 tp->t_drainwait = tty_drainwait; in tty_alloc_mutex()
1086 tty_init_termios(tp); in tty_alloc_mutex()
1088 cv_init(&tp->t_inwait, "ttyin"); in tty_alloc_mutex()
1089 cv_init(&tp->t_outwait, "ttyout"); in tty_alloc_mutex()
1090 cv_init(&tp->t_outserwait, "ttyosr"); in tty_alloc_mutex()
1091 cv_init(&tp->t_bgwait, "ttybg"); in tty_alloc_mutex()
1092 cv_init(&tp->t_dcdwait, "ttydcd"); in tty_alloc_mutex()
1096 tp->t_mtx = mutex; in tty_alloc_mutex()
1098 tp->t_mtx = &tp->t_mtxobj; in tty_alloc_mutex()
1099 mtx_init(&tp->t_mtxobj, "ttymtx", NULL, MTX_DEF); in tty_alloc_mutex()
1102 knlist_init_mtx(&tp->t_inpoll.si_note, tp->t_mtx); in tty_alloc_mutex()
1103 knlist_init_mtx(&tp->t_outpoll.si_note, tp->t_mtx); in tty_alloc_mutex()
1105 return (tp); in tty_alloc_mutex()
1111 struct tty *tp = arg; in tty_dealloc() local
1120 ttyinq_free(&tp->t_inq); in tty_dealloc()
1121 ttyoutq_free(&tp->t_outq); in tty_dealloc()
1122 seldrain(&tp->t_inpoll); in tty_dealloc()
1123 seldrain(&tp->t_outpoll); in tty_dealloc()
1124 knlist_clear(&tp->t_inpoll.si_note, 0); in tty_dealloc()
1125 knlist_clear(&tp->t_outpoll.si_note, 0); in tty_dealloc()
1126 knlist_destroy(&tp->t_inpoll.si_note); in tty_dealloc()
1127 knlist_destroy(&tp->t_outpoll.si_note); in tty_dealloc()
1129 cv_destroy(&tp->t_inwait); in tty_dealloc()
1130 cv_destroy(&tp->t_outwait); in tty_dealloc()
1131 cv_destroy(&tp->t_bgwait); in tty_dealloc()
1132 cv_destroy(&tp->t_dcdwait); in tty_dealloc()
1133 cv_destroy(&tp->t_outserwait); in tty_dealloc()
1135 if (tp->t_mtx == &tp->t_mtxobj) in tty_dealloc()
1136 mtx_destroy(&tp->t_mtxobj); in tty_dealloc()
1137 ttydevsw_free(tp); in tty_dealloc()
1138 free(tp, M_TTY); in tty_dealloc()
1142 tty_rel_free(struct tty *tp) in tty_rel_free() argument
1146 tty_assert_locked(tp); in tty_rel_free()
1149 if (tp->t_sessioncnt != 0 || (tp->t_flags & TF_ACTIVITY) != TF_GONE) { in tty_rel_free()
1151 tty_unlock(tp); in tty_rel_free()
1156 funsetown(&tp->t_sigio); in tty_rel_free()
1159 dev = tp->t_dev; in tty_rel_free()
1160 tp->t_dev = NULL; in tty_rel_free()
1161 tty_unlock(tp); in tty_rel_free()
1165 TAILQ_REMOVE(&tty_list, tp, t_list); in tty_rel_free()
1168 destroy_dev_sched_cb(dev, tty_dealloc, tp); in tty_rel_free()
1173 tty_rel_pgrp(struct tty *tp, struct pgrp *pg) in tty_rel_pgrp() argument
1176 MPASS(tp->t_sessioncnt > 0); in tty_rel_pgrp()
1177 tty_assert_locked(tp); in tty_rel_pgrp()
1179 if (tp->t_pgrp == pg) in tty_rel_pgrp()
1180 tp->t_pgrp = NULL; in tty_rel_pgrp()
1182 tty_unlock(tp); in tty_rel_pgrp()
1186 tty_rel_sess(struct tty *tp, struct session *sess) in tty_rel_sess() argument
1189 MPASS(tp->t_sessioncnt > 0); in tty_rel_sess()
1192 if (tp->t_session == sess) { in tty_rel_sess()
1193 tp->t_session = NULL; in tty_rel_sess()
1194 MPASS(tp->t_pgrp == NULL); in tty_rel_sess()
1196 tp->t_sessioncnt--; in tty_rel_sess()
1197 tty_rel_free(tp); in tty_rel_sess()
1201 tty_rel_gone(struct tty *tp) in tty_rel_gone() argument
1204 tty_assert_locked(tp); in tty_rel_gone()
1205 MPASS(!tty_gone(tp)); in tty_rel_gone()
1208 ttydisc_modem(tp, 0); in tty_rel_gone()
1211 tty_wakeup(tp, FREAD|FWRITE); in tty_rel_gone()
1212 cv_broadcast(&tp->t_bgwait); in tty_rel_gone()
1213 cv_broadcast(&tp->t_dcdwait); in tty_rel_gone()
1215 tp->t_flags |= TF_GONE; in tty_rel_gone()
1216 tty_rel_free(tp); in tty_rel_gone()
1220 tty_drop_ctty(struct tty *tp, struct proc *p) in tty_drop_ctty() argument
1233 tty_unlock(tp); in tty_drop_ctty()
1235 tty_lock(tp); in tty_drop_ctty()
1236 if (tty_gone(tp)) { in tty_drop_ctty()
1247 if (session->s_ttyp == NULL || session->s_ttyp != tp) { in tty_drop_ctty()
1265 tp->t_sessioncnt--; in tty_drop_ctty()
1289 tty_to_xtty(struct tty *tp, struct xtty *xt) in tty_to_xtty() argument
1292 tty_assert_locked(tp); in tty_to_xtty()
1296 xt->xt_insize = ttyinq_getsize(&tp->t_inq); in tty_to_xtty()
1297 xt->xt_incc = ttyinq_bytescanonicalized(&tp->t_inq); in tty_to_xtty()
1298 xt->xt_inlc = ttyinq_bytesline(&tp->t_inq); in tty_to_xtty()
1299 xt->xt_inlow = tp->t_inlow; in tty_to_xtty()
1300 xt->xt_outsize = ttyoutq_getsize(&tp->t_outq); in tty_to_xtty()
1301 xt->xt_outcc = ttyoutq_bytesused(&tp->t_outq); in tty_to_xtty()
1302 xt->xt_outlow = tp->t_outlow; in tty_to_xtty()
1303 xt->xt_column = tp->t_column; in tty_to_xtty()
1304 xt->xt_pgid = tp->t_pgrp ? tp->t_pgrp->pg_id : 0; in tty_to_xtty()
1305 xt->xt_sid = tp->t_session ? tp->t_session->s_sid : 0; in tty_to_xtty()
1306 xt->xt_flags = tp->t_flags; in tty_to_xtty()
1307 xt->xt_dev = tp->t_dev ? dev2udev(tp->t_dev) : (uint32_t)NODEV; in tty_to_xtty()
1316 struct tty *tp; in sysctl_kern_ttys() local
1330 TAILQ_FOREACH(tp, &tty_list, t_list) { in sysctl_kern_ttys()
1331 tty_lock(tp); in sysctl_kern_ttys()
1332 if (tp->t_session != NULL && in sysctl_kern_ttys()
1333 (p = atomic_load_ptr(&tp->t_session->s_leader)) != NULL) { in sysctl_kern_ttys()
1341 tty_to_xtty(tp, xt); in sysctl_kern_ttys()
1344 tty_unlock(tp); in sysctl_kern_ttys()
1367 tty_makedevf(struct tty *tp, struct ucred *cred, int flags, in tty_makedevf() argument
1381 if (tp->t_flags & TF_NOPREFIX) in tty_makedevf()
1411 args.mda_si_drv1 = tp; in tty_makedevf()
1415 tp->t_dev = dev; in tty_makedevf()
1420 if (tp->t_flags & TF_INITLOCK) { in tty_makedevf()
1423 args.mda_si_drv1 = tp; in tty_makedevf()
1424 args.mda_si_drv2 = &tp->t_termios_init_in; in tty_makedevf()
1431 args.mda_si_drv2 = &tp->t_termios_lock_in; in tty_makedevf()
1439 if (tp->t_flags & TF_CALLOUT) { in tty_makedevf()
1448 args.mda_si_drv1 = tp; in tty_makedevf()
1455 if (tp->t_flags & TF_INITLOCK) { in tty_makedevf()
1458 args.mda_si_drv2 = &tp->t_termios_init_out; in tty_makedevf()
1465 args.mda_si_drv2 = &tp->t_termios_lock_out; in tty_makedevf()
1474 TAILQ_INSERT_TAIL(&tty_list, tp, t_list); in tty_makedevf()
1499 tty_signal_sessleader(struct tty *tp, int sig) in tty_signal_sessleader() argument
1504 tty_assert_locked(tp); in tty_signal_sessleader()
1508 tp->t_flags &= ~TF_STOPPED; in tty_signal_sessleader()
1509 tp->t_termios.c_lflag &= ~FLUSHO; in tty_signal_sessleader()
1517 if ((s = tp->t_session) != NULL && in tty_signal_sessleader()
1526 tty_signal_pgrp(struct tty *tp, int sig) in tty_signal_pgrp() argument
1530 tty_assert_locked(tp); in tty_signal_pgrp()
1534 tp->t_flags &= ~TF_STOPPED; in tty_signal_pgrp()
1535 tp->t_termios.c_lflag &= ~FLUSHO; in tty_signal_pgrp()
1537 if (sig == SIGINFO && !(tp->t_termios.c_lflag & NOKERNINFO)) in tty_signal_pgrp()
1538 tty_info(tp); in tty_signal_pgrp()
1539 if (tp->t_pgrp != NULL) { in tty_signal_pgrp()
1543 PGRP_LOCK(tp->t_pgrp); in tty_signal_pgrp()
1544 pgsignal(tp->t_pgrp, sig, 1, &ksi); in tty_signal_pgrp()
1545 PGRP_UNLOCK(tp->t_pgrp); in tty_signal_pgrp()
1550 tty_wakeup(struct tty *tp, int flags) in tty_wakeup() argument
1553 if (tp->t_flags & TF_ASYNC && tp->t_sigio != NULL) in tty_wakeup()
1554 pgsigio(&tp->t_sigio, SIGIO, (tp->t_session != NULL)); in tty_wakeup()
1557 cv_broadcast(&tp->t_outwait); in tty_wakeup()
1558 selwakeup(&tp->t_outpoll); in tty_wakeup()
1559 KNOTE_LOCKED(&tp->t_outpoll.si_note, 0); in tty_wakeup()
1562 cv_broadcast(&tp->t_inwait); in tty_wakeup()
1563 selwakeup(&tp->t_inpoll); in tty_wakeup()
1564 KNOTE_LOCKED(&tp->t_inpoll.si_note, 0); in tty_wakeup()
1569 tty_wait(struct tty *tp, struct cv *cv) in tty_wait() argument
1572 int revokecnt = tp->t_revokecnt; in tty_wait()
1574 tty_lock_assert(tp, MA_OWNED|MA_NOTRECURSED); in tty_wait()
1575 MPASS(!tty_gone(tp)); in tty_wait()
1577 error = cv_wait_sig(cv, tp->t_mtx); in tty_wait()
1580 if (tty_gone(tp)) in tty_wait()
1584 if (tp->t_revokecnt != revokecnt) in tty_wait()
1591 tty_timedwait(struct tty *tp, struct cv *cv, int hz) in tty_timedwait() argument
1594 int revokecnt = tp->t_revokecnt; in tty_timedwait()
1596 tty_lock_assert(tp, MA_OWNED|MA_NOTRECURSED); in tty_timedwait()
1597 MPASS(!tty_gone(tp)); in tty_timedwait()
1599 error = cv_timedwait_sig(cv, tp->t_mtx, hz); in tty_timedwait()
1602 if (tty_gone(tp)) in tty_timedwait()
1606 if (tp->t_revokecnt != revokecnt) in tty_timedwait()
1613 tty_flush(struct tty *tp, int flags) in tty_flush() argument
1617 tp->t_flags &= ~TF_HIWAT_OUT; in tty_flush()
1618 ttyoutq_flush(&tp->t_outq); in tty_flush()
1619 tty_wakeup(tp, FWRITE); in tty_flush()
1620 if (!tty_gone(tp)) { in tty_flush()
1621 ttydevsw_outwakeup(tp); in tty_flush()
1622 ttydevsw_pktnotify(tp, TIOCPKT_FLUSHWRITE); in tty_flush()
1626 tty_hiwat_in_unblock(tp); in tty_flush()
1627 ttyinq_flush(&tp->t_inq); in tty_flush()
1628 tty_wakeup(tp, FREAD); in tty_flush()
1629 if (!tty_gone(tp)) { in tty_flush()
1630 ttydevsw_inwakeup(tp); in tty_flush()
1631 ttydevsw_pktnotify(tp, TIOCPKT_FLUSHREAD); in tty_flush()
1637 tty_set_winsize(struct tty *tp, const struct winsize *wsz) in tty_set_winsize() argument
1640 if (memcmp(&tp->t_winsize, wsz, sizeof(*wsz)) == 0) in tty_set_winsize()
1642 tp->t_winsize = *wsz; in tty_set_winsize()
1643 tty_signal_pgrp(tp, SIGWINCH); in tty_set_winsize()
1647 tty_generic_ioctl(struct tty *tp, u_long cmd, void *data, int fflag, in tty_generic_ioctl() argument
1659 ttydevsw_modem(tp, SER_DTR, 0); in tty_generic_ioctl()
1662 ttydevsw_modem(tp, 0, SER_DTR); in tty_generic_ioctl()
1666 ttydevsw_modem(tp, in tty_generic_ioctl()
1673 ttydevsw_modem(tp, (bits & (TIOCM_DTR | TIOCM_RTS)) >> 1, 0); in tty_generic_ioctl()
1678 ttydevsw_modem(tp, 0, (bits & (TIOCM_DTR | TIOCM_RTS)) >> 1); in tty_generic_ioctl()
1682 *(int *)data = TIOCM_LE + (ttydevsw_modem(tp, 0, 0) << 1); in tty_generic_ioctl()
1687 tp->t_flags |= TF_ASYNC; in tty_generic_ioctl()
1689 tp->t_flags &= ~TF_ASYNC; in tty_generic_ioctl()
1695 *(int *)data = ttydisc_bytesavail(tp); in tty_generic_ioctl()
1699 *(int *)data = ttyoutq_bytesused(&tp->t_outq); in tty_generic_ioctl()
1702 if (tp->t_session != NULL && !tty_is_ctty(tp, td->td_proc)) in tty_generic_ioctl()
1707 tty_unlock(tp); in tty_generic_ioctl()
1708 error = fsetown(*(int *)data, &tp->t_sigio); in tty_generic_ioctl()
1709 tty_lock(tp); in tty_generic_ioctl()
1712 if (tp->t_session != NULL && !tty_is_ctty(tp, td->td_proc)) in tty_generic_ioctl()
1717 *(int *)data = fgetown(&tp->t_sigio); in tty_generic_ioctl()
1721 *(struct termios*)data = tp->t_termios; in tty_generic_ioctl()
1745 error = tty_drain(tp, 0); in tty_generic_ioctl()
1749 tty_flush(tp, FREAD); in tty_generic_ioctl()
1756 (tp->t_termios.c_cflag != t->c_cflag || in tty_generic_ioctl()
1757 ((tp->t_termios.c_iflag ^ t->c_iflag) & in tty_generic_ioctl()
1759 tp->t_termios.c_ispeed != t->c_ispeed || in tty_generic_ioctl()
1760 tp->t_termios.c_ospeed != t->c_ospeed)) { in tty_generic_ioctl()
1761 error = ttydevsw_param(tp, t); in tty_generic_ioctl()
1767 tp->t_termios.c_cflag = t->c_cflag & ~CIGNORE; in tty_generic_ioctl()
1768 tp->t_termios.c_ispeed = t->c_ispeed; in tty_generic_ioctl()
1769 tp->t_termios.c_ospeed = t->c_ospeed; in tty_generic_ioctl()
1772 error = tty_watermarks(tp); in tty_generic_ioctl()
1784 if ((t->c_lflag & ICANON) != (tp->t_termios.c_lflag & ICANON)) in tty_generic_ioctl()
1786 else if (tp->t_termios.c_cc[VEOF] != t->c_cc[VEOF] || in tty_generic_ioctl()
1787 tp->t_termios.c_cc[VEOL] != t->c_cc[VEOL]) in tty_generic_ioctl()
1791 tp->t_termios.c_iflag = t->c_iflag; in tty_generic_ioctl()
1792 tp->t_termios.c_oflag = t->c_oflag; in tty_generic_ioctl()
1793 tp->t_termios.c_lflag = t->c_lflag; in tty_generic_ioctl()
1794 memcpy(&tp->t_termios.c_cc, t->c_cc, sizeof t->c_cc); in tty_generic_ioctl()
1796 ttydisc_optimize(tp); in tty_generic_ioctl()
1799 ttydisc_canonicalize(tp); in tty_generic_ioctl()
1807 tty_wakeup(tp, FREAD); in tty_generic_ioctl()
1814 if (tp->t_termios.c_iflag & IXON && in tty_generic_ioctl()
1815 tp->t_termios.c_cc[VSTOP] == CTRL('S') && in tty_generic_ioctl()
1816 tp->t_termios.c_cc[VSTART] == CTRL('Q')) in tty_generic_ioctl()
1817 ttydevsw_pktnotify(tp, TIOCPKT_DOSTOP); in tty_generic_ioctl()
1819 ttydevsw_pktnotify(tp, TIOCPKT_NOSTOP); in tty_generic_ioctl()
1827 if (!tty_is_ctty(tp, td->td_proc)) in tty_generic_ioctl()
1830 if (tp->t_pgrp != NULL) in tty_generic_ioctl()
1831 *(int *)data = tp->t_pgrp->pg_id; in tty_generic_ioctl()
1836 if (!tty_is_ctty(tp, td->td_proc)) in tty_generic_ioctl()
1839 MPASS(tp->t_session); in tty_generic_ioctl()
1840 *(int *)data = tp->t_session->s_sid; in tty_generic_ioctl()
1843 return (tty_drop_ctty(tp, td->td_proc)); in tty_generic_ioctl()
1848 tty_unlock(tp); in tty_generic_ioctl()
1850 tty_lock(tp); in tty_generic_ioctl()
1858 if (tp->t_session != NULL && tp->t_session == p->p_session) { in tty_generic_ioctl()
1865 (tp->t_session != NULL && tp->t_session->s_ttyvp != NULL && in tty_generic_ioctl()
1866 tp->t_session->s_ttyvp->v_type != VBAD)) { in tty_generic_ioctl()
1883 tp->t_session = p->p_session; in tty_generic_ioctl()
1884 tp->t_session->s_ttyp = tp; in tty_generic_ioctl()
1885 tp->t_sessioncnt++; in tty_generic_ioctl()
1888 tp->t_pgrp = p->p_pgrp; in tty_generic_ioctl()
1904 tty_unlock(tp); in tty_generic_ioctl()
1911 tty_lock(tp); in tty_generic_ioctl()
1914 tty_lock(tp); in tty_generic_ioctl()
1920 if (!tty_is_ctty(tp, td->td_proc)) { in tty_generic_ioctl()
1924 tp->t_pgrp = pg; in tty_generic_ioctl()
1928 cv_broadcast(&tp->t_bgwait); in tty_generic_ioctl()
1938 tty_flush(tp, flags); in tty_generic_ioctl()
1943 return tty_drain(tp, 0); in tty_generic_ioctl()
1945 *(int *)data = tp->t_drainwait; in tty_generic_ioctl()
1950 tp->t_drainwait = *(int *)data; in tty_generic_ioctl()
1958 error = constty_set(tp); in tty_generic_ioctl()
1960 error = constty_clear(tp); in tty_generic_ioctl()
1965 *(struct winsize*)data = tp->t_winsize; in tty_generic_ioctl()
1969 tty_set_winsize(tp, data); in tty_generic_ioctl()
1972 tp->t_flags |= TF_EXCLUDE; in tty_generic_ioctl()
1975 tp->t_flags &= ~TF_EXCLUDE; in tty_generic_ioctl()
1978 tp->t_flags |= TF_STOPPED; in tty_generic_ioctl()
1979 ttydevsw_pktnotify(tp, TIOCPKT_STOP); in tty_generic_ioctl()
1982 tp->t_flags &= ~TF_STOPPED; in tty_generic_ioctl()
1983 tp->t_termios.c_lflag &= ~FLUSHO; in tty_generic_ioctl()
1984 ttydevsw_outwakeup(tp); in tty_generic_ioctl()
1985 ttydevsw_pktnotify(tp, TIOCPKT_START); in tty_generic_ioctl()
1988 tty_info(tp); in tty_generic_ioctl()
1993 if (!tty_is_ctty(tp, td->td_proc) && in tty_generic_ioctl()
1996 ttydisc_rint(tp, *(char *)data, 0); in tty_generic_ioctl()
1997 ttydisc_rint_done(tp); in tty_generic_ioctl()
2002 return tty_ioctl_compat(tp, cmd, data, fflag, td); in tty_generic_ioctl()
2009 tty_ioctl(struct tty *tp, u_long cmd, void *data, int fflag, struct thread *td) in tty_ioctl() argument
2013 tty_assert_locked(tp); in tty_ioctl()
2015 if (tty_gone(tp)) in tty_ioctl()
2018 error = ttydevsw_ioctl(tp, cmd, data, td); in tty_ioctl()
2020 error = tty_generic_ioctl(tp, cmd, data, fflag, td); in tty_ioctl()
2026 tty_udev(struct tty *tp) in tty_udev() argument
2029 if (tp->t_dev) in tty_udev()
2030 return (dev2udev(tp->t_dev)); in tty_udev()
2036 tty_checkoutq(struct tty *tp) in tty_checkoutq() argument
2040 return (ttyoutq_bytesleft(&tp->t_outq) >= 256); in tty_checkoutq()
2044 tty_hiwat_in_block(struct tty *tp) in tty_hiwat_in_block() argument
2047 if ((tp->t_flags & TF_HIWAT_IN) == 0 && in tty_hiwat_in_block()
2048 tp->t_termios.c_iflag & IXOFF && in tty_hiwat_in_block()
2049 tp->t_termios.c_cc[VSTOP] != _POSIX_VDISABLE) { in tty_hiwat_in_block()
2054 if (ttyoutq_write_nofrag(&tp->t_outq, in tty_hiwat_in_block()
2055 &tp->t_termios.c_cc[VSTOP], 1) == 0) in tty_hiwat_in_block()
2056 tp->t_flags |= TF_HIWAT_IN; in tty_hiwat_in_block()
2059 tp->t_flags |= TF_HIWAT_IN; in tty_hiwat_in_block()
2064 tty_hiwat_in_unblock(struct tty *tp) in tty_hiwat_in_unblock() argument
2067 if (tp->t_flags & TF_HIWAT_IN && in tty_hiwat_in_unblock()
2068 tp->t_termios.c_iflag & IXOFF && in tty_hiwat_in_unblock()
2069 tp->t_termios.c_cc[VSTART] != _POSIX_VDISABLE) { in tty_hiwat_in_unblock()
2074 if (ttyoutq_write_nofrag(&tp->t_outq, in tty_hiwat_in_unblock()
2075 &tp->t_termios.c_cc[VSTART], 1) == 0) in tty_hiwat_in_unblock()
2076 tp->t_flags &= ~TF_HIWAT_IN; in tty_hiwat_in_unblock()
2079 tp->t_flags &= ~TF_HIWAT_IN; in tty_hiwat_in_unblock()
2082 if (!tty_gone(tp)) in tty_hiwat_in_unblock()
2083 ttydevsw_inwakeup(tp); in tty_hiwat_in_unblock()
2091 ttyhook_defrint(struct tty *tp, char c, int flags) in ttyhook_defrint() argument
2094 if (ttyhook_rint_bypass(tp, &c, 1) != 1) in ttyhook_defrint()
2104 struct tty *tp; in ttyhook_register() local
2157 tp = dev->si_drv1; in ttyhook_register()
2161 tty_lock(tp); in ttyhook_register()
2162 MPASS((tp->t_hook == NULL) == ((tp->t_flags & TF_HOOK) == 0)); in ttyhook_register()
2163 if (tp->t_flags & TF_HOOK) in ttyhook_register()
2166 tp->t_flags |= TF_HOOK; in ttyhook_register()
2167 tp->t_hook = th; in ttyhook_register()
2168 tp->t_hooksoftc = softc; in ttyhook_register()
2169 *rtp = tp; in ttyhook_register()
2173 ttydisc_optimize(tp); in ttyhook_register()
2176 if (!ttyhook_hashook(tp, rint) && ttyhook_hashook(tp, rint_bypass)) in ttyhook_register()
2179 done3: tty_unlock(tp); in ttyhook_register()
2186 ttyhook_unregister(struct tty *tp) in ttyhook_unregister() argument
2189 tty_assert_locked(tp); in ttyhook_unregister()
2190 MPASS(tp->t_flags & TF_HOOK); in ttyhook_unregister()
2193 tp->t_flags &= ~TF_HOOK; in ttyhook_unregister()
2194 tp->t_hook = NULL; in ttyhook_unregister()
2197 ttydisc_optimize(tp); in ttyhook_unregister()
2200 tty_rel_free(tp); in ttyhook_unregister()
2210 struct tty *tp; in ttyconsdev_open() local
2218 TAILQ_FOREACH(tp, &tty_list, t_list) { in ttyconsdev_open()
2219 if (strcmp(dev_console_filename, tty_devname(tp)) == 0) { in ttyconsdev_open()
2220 dev_console->si_drv1 = tp; in ttyconsdev_open()
2390 struct tty *tp; in DB_SHOW_COMMAND() local
2396 tp = (struct tty *)addr; in DB_SHOW_COMMAND()
2398 db_printf("%p: %s\n", tp, tty_devname(tp)); in DB_SHOW_COMMAND()
2399 db_printf("\tmtx: %p\n", tp->t_mtx); in DB_SHOW_COMMAND()
2400 db_printf("\tflags: 0x%b\n", tp->t_flags, TTY_FLAG_BITS); in DB_SHOW_COMMAND()
2401 db_printf("\trevokecnt: %u\n", tp->t_revokecnt); in DB_SHOW_COMMAND()
2405 "nblocks %u quota %u\n", &tp->t_inq, tp->t_inq.ti_begin, in DB_SHOW_COMMAND()
2406 tp->t_inq.ti_linestart, tp->t_inq.ti_reprint, tp->t_inq.ti_end, in DB_SHOW_COMMAND()
2407 tp->t_inq.ti_nblocks, tp->t_inq.ti_quota); in DB_SHOW_COMMAND()
2409 &tp->t_outq, tp->t_outq.to_begin, tp->t_outq.to_end, in DB_SHOW_COMMAND()
2410 tp->t_outq.to_nblocks, tp->t_outq.to_quota); in DB_SHOW_COMMAND()
2411 db_printf("\tinlow: %zu\n", tp->t_inlow); in DB_SHOW_COMMAND()
2412 db_printf("\toutlow: %zu\n", tp->t_outlow); in DB_SHOW_COMMAND()
2413 _db_show_termios("\ttermios", &tp->t_termios); in DB_SHOW_COMMAND()
2415 tp->t_winsize.ws_row, tp->t_winsize.ws_col, in DB_SHOW_COMMAND()
2416 tp->t_winsize.ws_xpixel, tp->t_winsize.ws_ypixel); in DB_SHOW_COMMAND()
2417 db_printf("\tcolumn: %u\n", tp->t_column); in DB_SHOW_COMMAND()
2418 db_printf("\twritepos: %u\n", tp->t_writepos); in DB_SHOW_COMMAND()
2419 db_printf("\tcompatflags: 0x%x\n", tp->t_compatflags); in DB_SHOW_COMMAND()
2422 _db_show_termios("\ttermios_init_in", &tp->t_termios_init_in); in DB_SHOW_COMMAND()
2423 _db_show_termios("\ttermios_init_out", &tp->t_termios_init_out); in DB_SHOW_COMMAND()
2424 _db_show_termios("\ttermios_lock_in", &tp->t_termios_lock_in); in DB_SHOW_COMMAND()
2425 _db_show_termios("\ttermios_lock_out", &tp->t_termios_lock_out); in DB_SHOW_COMMAND()
2428 _db_show_devsw("\t", tp->t_devsw); in DB_SHOW_COMMAND()
2429 _db_show_hooks("\t", tp->t_hook); in DB_SHOW_COMMAND()
2432 db_printf("\tpgrp: %p gid %d\n", tp->t_pgrp, in DB_SHOW_COMMAND()
2433 tp->t_pgrp ? tp->t_pgrp->pg_id : 0); in DB_SHOW_COMMAND()
2434 db_printf("\tsession: %p", tp->t_session); in DB_SHOW_COMMAND()
2435 if (tp->t_session != NULL) in DB_SHOW_COMMAND()
2437 tp->t_session->s_count, tp->t_session->s_leader, in DB_SHOW_COMMAND()
2438 tp->t_session->s_ttyp, tp->t_session->s_sid, in DB_SHOW_COMMAND()
2439 tp->t_session->s_login); in DB_SHOW_COMMAND()
2441 db_printf("\tsessioncnt: %u\n", tp->t_sessioncnt); in DB_SHOW_COMMAND()
2442 db_printf("\tdevswsoftc: %p\n", tp->t_devswsoftc); in DB_SHOW_COMMAND()
2443 db_printf("\thooksoftc: %p\n", tp->t_hooksoftc); in DB_SHOW_COMMAND()
2444 db_printf("\tdev: %p\n", tp->t_dev); in DB_SHOW_COMMAND()
2450 struct tty *tp; in DB_SHOW_ALL_COMMAND() local
2462 TAILQ_FOREACH(tp, &tty_list, t_list) { in DB_SHOW_ALL_COMMAND()
2463 isiz = tp->t_inq.ti_nblocks * TTYINQ_DATASIZE; in DB_SHOW_ALL_COMMAND()
2464 osiz = tp->t_outq.to_nblocks * TTYOUTQ_DATASIZE; in DB_SHOW_ALL_COMMAND()
2467 "%5d ", tp, tty_devname(tp), isiz, in DB_SHOW_ALL_COMMAND()
2468 tp->t_inq.ti_linestart - tp->t_inq.ti_begin, in DB_SHOW_ALL_COMMAND()
2469 tp->t_inq.ti_end - tp->t_inq.ti_linestart, in DB_SHOW_ALL_COMMAND()
2470 isiz - tp->t_inlow, osiz, in DB_SHOW_ALL_COMMAND()
2471 tp->t_outq.to_end - tp->t_outq.to_begin, in DB_SHOW_ALL_COMMAND()
2472 osiz - tp->t_outlow, MIN(tp->t_column, 99999), in DB_SHOW_ALL_COMMAND()
2473 tp->t_session ? tp->t_session->s_sid : 0, in DB_SHOW_ALL_COMMAND()
2474 tp->t_pgrp ? tp->t_pgrp->pg_id : 0); in DB_SHOW_ALL_COMMAND()
2478 if (tp->t_flags & ttystates[i].flag) { in DB_SHOW_ALL_COMMAND()