Lines Matching refs:tp
74 static void tty_rel_free(struct tty *tp);
98 #define TTY_CALLOUT(tp,d) (dev2unit(d) & TTYUNIT_CALLOUT) argument
123 tty_watermarks(struct tty *tp) in tty_watermarks() argument
129 if (tp->t_termios.c_cflag & CREAD) in tty_watermarks()
130 bs = MIN(tp->t_termios.c_ispeed / 5, TTYBUF_MAX); in tty_watermarks()
131 error = ttyinq_setsize(&tp->t_inq, tp, bs); in tty_watermarks()
136 tp->t_inlow = (ttyinq_getallocatedsize(&tp->t_inq) * 9) / 10; in tty_watermarks()
139 bs = MIN(tp->t_termios.c_ospeed / 5, TTYBUF_MAX); in tty_watermarks()
140 error = ttyoutq_setsize(&tp->t_outq, tp, bs); in tty_watermarks()
145 tp->t_outlow = (ttyoutq_getallocatedsize(&tp->t_outq) * 9) / 10; in tty_watermarks()
151 tty_drain(struct tty *tp, int leaving) in tty_drain() argument
157 if (ttyhook_hashook(tp, getc_inject)) in tty_drain()
168 else if (tp->t_drainwait != 0) in tty_drain()
169 timeout_at = getsbinuptime() + SBT_1S * tp->t_drainwait; in tty_drain()
182 bytes = ttyoutq_bytesused(&tp->t_outq); in tty_drain()
184 if (ttyoutq_bytesused(&tp->t_outq) == 0 && !ttydevsw_busy(tp)) in tty_drain()
188 ttydevsw_outwakeup(tp); in tty_drain()
189 error = tty_timedwait(tp, &tp->t_outwait, hz / 10); in tty_drain()
194 else if (leaving && ttyoutq_bytesused(&tp->t_outq) < bytes) { in tty_drain()
198 bytes = ttyoutq_bytesused(&tp->t_outq); in tty_drain()
213 ttydev_enter(struct tty *tp) in ttydev_enter() argument
216 tty_lock(tp); in ttydev_enter()
218 if (tty_gone(tp) || !tty_opened(tp)) { in ttydev_enter()
220 tty_unlock(tp); in ttydev_enter()
228 ttydev_leave(struct tty *tp) in ttydev_leave() argument
231 tty_assert_locked(tp); in ttydev_leave()
233 if (tty_opened(tp) || tp->t_flags & TF_OPENCLOSE) { in ttydev_leave()
235 tty_unlock(tp); in ttydev_leave()
239 tp->t_flags |= TF_OPENCLOSE; in ttydev_leave()
242 constty_clear(tp); in ttydev_leave()
245 if (!tty_gone(tp)) in ttydev_leave()
246 tty_drain(tp, 1); in ttydev_leave()
248 ttydisc_close(tp); in ttydev_leave()
251 ttyinq_free(&tp->t_inq); in ttydev_leave()
252 tp->t_inlow = 0; in ttydev_leave()
253 ttyoutq_free(&tp->t_outq); in ttydev_leave()
254 tp->t_outlow = 0; in ttydev_leave()
256 if (!tty_gone(tp)) in ttydev_leave()
257 ttydevsw_close(tp); in ttydev_leave()
259 tp->t_flags &= ~TF_OPENCLOSE; in ttydev_leave()
260 cv_broadcast(&tp->t_dcdwait); in ttydev_leave()
261 tty_rel_free(tp); in ttydev_leave()
271 struct tty *tp; in ttydev_open() local
274 tp = dev->si_drv1; in ttydev_open()
276 tty_lock(tp); in ttydev_open()
277 if (tty_gone(tp)) { in ttydev_open()
279 tty_unlock(tp); in ttydev_open()
287 while (tp->t_flags & TF_OPENCLOSE) { in ttydev_open()
288 error = tty_wait(tp, &tp->t_dcdwait); in ttydev_open()
290 tty_unlock(tp); in ttydev_open()
294 tp->t_flags |= TF_OPENCLOSE; in ttydev_open()
300 if (TTY_CALLOUT(tp, dev)) { in ttydev_open()
301 if (tp->t_flags & (TF_OPENED_CONS | TF_OPENED_IN)) { in ttydev_open()
306 if (tp->t_flags & TF_OPENED_OUT) { in ttydev_open()
312 if (tp->t_flags & TF_EXCLUDE && priv_check(td, PRIV_TTY_EXCLUSIVE)) { in ttydev_open()
317 if (!tty_opened(tp)) { in ttydev_open()
319 if (TTY_CALLOUT(tp, dev)) in ttydev_open()
320 tp->t_termios = tp->t_termios_init_out; in ttydev_open()
322 tp->t_termios = tp->t_termios_init_in; in ttydev_open()
323 ttydevsw_param(tp, &tp->t_termios); in ttydev_open()
325 if (TTY_CALLOUT(tp, dev) || dev == dev_console) in ttydev_open()
326 tp->t_termios.c_cflag |= CLOCAL; in ttydev_open()
328 if ((tp->t_termios.c_cflag & CNO_RTSDTR) == 0) in ttydev_open()
329 ttydevsw_modem(tp, SER_DTR|SER_RTS, 0); in ttydev_open()
331 error = ttydevsw_open(tp); in ttydev_open()
335 ttydisc_open(tp); in ttydev_open()
336 error = tty_watermarks(tp); in ttydev_open()
343 (tp->t_termios.c_cflag & CLOCAL) == 0) { in ttydev_open()
344 while ((ttydevsw_modem(tp, 0, 0) & SER_DCD) == 0) { in ttydev_open()
345 error = tty_wait(tp, &tp->t_dcdwait); in ttydev_open()
352 tp->t_flags |= TF_OPENED_CONS; in ttydev_open()
353 else if (TTY_CALLOUT(tp, dev)) in ttydev_open()
354 tp->t_flags |= TF_OPENED_OUT; in ttydev_open()
356 tp->t_flags |= TF_OPENED_IN; in ttydev_open()
357 MPASS((tp->t_flags & (TF_OPENED_CONS | TF_OPENED_IN)) == 0 || in ttydev_open()
358 (tp->t_flags & TF_OPENED_OUT) == 0); in ttydev_open()
360 done: tp->t_flags &= ~TF_OPENCLOSE; in ttydev_open()
361 cv_broadcast(&tp->t_dcdwait); in ttydev_open()
362 ttydev_leave(tp); in ttydev_open()
371 struct tty *tp = dev->si_drv1; in ttydev_close() local
373 tty_lock(tp); in ttydev_close()
379 MPASS((tp->t_flags & (TF_OPENED_CONS | TF_OPENED_IN)) == 0 || in ttydev_close()
380 (tp->t_flags & TF_OPENED_OUT) == 0); in ttydev_close()
382 tp->t_flags &= ~TF_OPENED_CONS; in ttydev_close()
384 tp->t_flags &= ~(TF_OPENED_IN|TF_OPENED_OUT); in ttydev_close()
386 if (tp->t_flags & TF_OPENED) { in ttydev_close()
387 tty_unlock(tp); in ttydev_close()
393 tty_flush(tp, FWRITE); in ttydev_close()
394 knlist_delete(&tp->t_inpoll.si_note, td, 1); in ttydev_close()
395 knlist_delete(&tp->t_outpoll.si_note, td, 1); in ttydev_close()
398 tp->t_flags &= ~TF_EXCLUDE; in ttydev_close()
401 tp->t_revokecnt++; in ttydev_close()
402 tty_wakeup(tp, FREAD|FWRITE); in ttydev_close()
403 cv_broadcast(&tp->t_bgwait); in ttydev_close()
404 cv_broadcast(&tp->t_dcdwait); in ttydev_close()
406 ttydev_leave(tp); in ttydev_close()
412 tty_is_ctty(struct tty *tp, struct proc *p) in tty_is_ctty() argument
415 tty_assert_locked(tp); in tty_is_ctty()
417 return (p->p_session == tp->t_session && p->p_flag & P_CONTROLT); in tty_is_ctty()
421 tty_wait_background(struct tty *tp, struct thread *td, int sig) in tty_wait_background() argument
429 tty_assert_locked(tp); in tty_wait_background()
456 if (!tty_is_ctty(tp, p) || p->p_pgrp == tp->t_pgrp) { in tty_wait_background()
494 error = tty_wait(tp, &tp->t_bgwait); in tty_wait_background()
503 struct tty *tp = dev->si_drv1; in ttydev_read() local
506 error = ttydev_enter(tp); in ttydev_read()
509 error = ttydisc_read(tp, uio, ioflag); in ttydev_read()
510 tty_unlock(tp); in ttydev_read()
524 struct tty *tp = dev->si_drv1; in ttydev_write() local
527 error = ttydev_enter(tp); in ttydev_write()
531 if (tp->t_termios.c_lflag & TOSTOP) { in ttydev_write()
532 error = tty_wait_background(tp, curthread, SIGTTOU); in ttydev_write()
537 if (ioflag & IO_NDELAY && tp->t_flags & TF_BUSY_OUT) { in ttydev_write()
539 error = ttydisc_write(tp, uio, ioflag); in ttydev_write()
542 while (tp->t_flags & TF_BUSY_OUT) { in ttydev_write()
543 error = tty_wait(tp, &tp->t_outserwait); in ttydev_write()
548 tp->t_flags |= TF_BUSY_OUT; in ttydev_write()
550 error = ttydisc_write(tp, uio, ioflag); in ttydev_write()
552 tp->t_flags &= ~TF_BUSY_OUT; in ttydev_write()
553 cv_signal(&tp->t_outserwait); in ttydev_write()
556 done: tty_unlock(tp); in ttydev_write()
564 struct tty *tp = dev->si_drv1; in ttydev_ioctl() local
567 error = ttydev_enter(tp); in ttydev_ioctl()
607 error = tty_wait_background(tp, curthread, SIGTTOU); in ttydev_ioctl()
613 struct termios *old = &tp->t_termios; in ttydev_ioctl()
615 struct termios *lock = TTY_CALLOUT(tp, dev) ? in ttydev_ioctl()
616 &tp->t_termios_lock_out : &tp->t_termios_lock_in; in ttydev_ioctl()
640 error = tty_ioctl(tp, cmd, data, fflag, td); in ttydev_ioctl()
641 done: tty_unlock(tp); in ttydev_ioctl()
649 struct tty *tp = dev->si_drv1; in ttydev_poll() local
652 error = ttydev_enter(tp); in ttydev_poll()
658 if (ttydisc_read_poll(tp) > 0) in ttydev_poll()
662 if (tp->t_flags & TF_ZOMBIE) { in ttydev_poll()
667 if (ttydisc_write_poll(tp) > 0) in ttydev_poll()
673 selrecord(td, &tp->t_inpoll); in ttydev_poll()
675 selrecord(td, &tp->t_outpoll); in ttydev_poll()
678 tty_unlock(tp); in ttydev_poll()
687 struct tty *tp = dev->si_drv1; in ttydev_mmap() local
692 error = ttydev_enter(tp); in ttydev_mmap()
695 error = ttydevsw_mmap(tp, offset, paddr, nprot, memattr); in ttydev_mmap()
696 tty_unlock(tp); in ttydev_mmap()
708 struct tty *tp = kn->kn_hook; in tty_kqops_read_detach() local
710 knlist_remove(&tp->t_inpoll.si_note, kn, 0); in tty_kqops_read_detach()
716 struct tty *tp = kn->kn_hook; in tty_kqops_read_event() local
718 tty_assert_locked(tp); in tty_kqops_read_event()
720 if (tty_gone(tp) || tp->t_flags & TF_ZOMBIE) { in tty_kqops_read_event()
724 kn->kn_data = ttydisc_read_poll(tp); in tty_kqops_read_event()
732 struct tty *tp = kn->kn_hook; in tty_kqops_write_detach() local
734 knlist_remove(&tp->t_outpoll.si_note, kn, 0); in tty_kqops_write_detach()
740 struct tty *tp = kn->kn_hook; in tty_kqops_write_event() local
742 tty_assert_locked(tp); in tty_kqops_write_event()
744 if (tty_gone(tp)) { in tty_kqops_write_event()
748 kn->kn_data = ttydisc_write_poll(tp); in tty_kqops_write_event()
768 struct tty *tp = dev->si_drv1; in ttydev_kqfilter() local
771 error = ttydev_enter(tp); in ttydev_kqfilter()
777 kn->kn_hook = tp; in ttydev_kqfilter()
779 knlist_add(&tp->t_inpoll.si_note, kn, 1); in ttydev_kqfilter()
782 kn->kn_hook = tp; in ttydev_kqfilter()
784 knlist_add(&tp->t_outpoll.si_note, kn, 1); in ttydev_kqfilter()
791 tty_unlock(tp); in ttydev_kqfilter()
817 struct tty *tp; in ttyil_open() local
820 tp = dev->si_drv1; in ttyil_open()
822 tty_lock(tp); in ttyil_open()
823 if (tty_gone(tp)) in ttyil_open()
825 tty_unlock(tp); in ttyil_open()
850 struct tty *tp = dev->si_drv1; in ttyil_ioctl() local
853 tty_lock(tp); in ttyil_ioctl()
854 if (tty_gone(tp)) { in ttyil_ioctl()
859 error = ttydevsw_cioctl(tp, dev2unit(dev), cmd, data, td); in ttyil_ioctl()
886 done: tty_unlock(tp); in ttyil_ioctl()
902 tty_init_termios(struct tty *tp) in tty_init_termios() argument
904 struct termios *t = &tp->t_termios_init_in; in tty_init_termios()
914 tp->t_termios_init_out = *t; in tty_init_termios()
918 tty_init_console(struct tty *tp, speed_t s) in tty_init_console() argument
920 struct termios *ti = &tp->t_termios_init_in; in tty_init_console()
921 struct termios *to = &tp->t_termios_init_out; in tty_init_console()
939 ttydevsw_defopen(struct tty *tp __unused) in ttydevsw_defopen()
946 ttydevsw_defclose(struct tty *tp __unused) in ttydevsw_defclose()
952 ttydevsw_defoutwakeup(struct tty *tp __unused) in ttydevsw_defoutwakeup()
959 ttydevsw_definwakeup(struct tty *tp __unused) in ttydevsw_definwakeup()
965 ttydevsw_defioctl(struct tty *tp __unused, u_long cmd __unused, in ttydevsw_defioctl()
973 ttydevsw_defcioctl(struct tty *tp __unused, int unit __unused, in ttydevsw_defcioctl()
981 ttydevsw_defparam(struct tty *tp __unused, struct termios *t) in ttydevsw_defparam()
1003 ttydevsw_defmodem(struct tty *tp __unused, int sigon __unused, in ttydevsw_defmodem()
1012 ttydevsw_defmmap(struct tty *tp __unused, vm_ooffset_t offset __unused, in ttydevsw_defmmap()
1021 ttydevsw_defpktnotify(struct tty *tp __unused, char event __unused) in ttydevsw_defpktnotify()
1034 ttydevsw_defbusy(struct tty *tp __unused) in ttydevsw_defbusy()
1056 struct tty *tp; in tty_alloc_mutex() local
1077 tp = malloc(sizeof(struct tty) + TTY_PRBUF_SIZE, M_TTY, in tty_alloc_mutex()
1079 tp->t_prbufsz = TTY_PRBUF_SIZE; in tty_alloc_mutex()
1080 tp->t_devsw = tsw; in tty_alloc_mutex()
1081 tp->t_devswsoftc = sc; in tty_alloc_mutex()
1082 tp->t_flags = tsw->tsw_flags; in tty_alloc_mutex()
1083 tp->t_drainwait = tty_drainwait; in tty_alloc_mutex()
1085 tty_init_termios(tp); in tty_alloc_mutex()
1087 cv_init(&tp->t_inwait, "ttyin"); in tty_alloc_mutex()
1088 cv_init(&tp->t_outwait, "ttyout"); in tty_alloc_mutex()
1089 cv_init(&tp->t_outserwait, "ttyosr"); in tty_alloc_mutex()
1090 cv_init(&tp->t_bgwait, "ttybg"); in tty_alloc_mutex()
1091 cv_init(&tp->t_dcdwait, "ttydcd"); in tty_alloc_mutex()
1095 tp->t_mtx = mutex; in tty_alloc_mutex()
1097 tp->t_mtx = &tp->t_mtxobj; in tty_alloc_mutex()
1098 mtx_init(&tp->t_mtxobj, "ttymtx", NULL, MTX_DEF); in tty_alloc_mutex()
1101 knlist_init_mtx(&tp->t_inpoll.si_note, tp->t_mtx); in tty_alloc_mutex()
1102 knlist_init_mtx(&tp->t_outpoll.si_note, tp->t_mtx); in tty_alloc_mutex()
1104 return (tp); in tty_alloc_mutex()
1110 struct tty *tp = arg; in tty_dealloc() local
1119 ttyinq_free(&tp->t_inq); in tty_dealloc()
1120 ttyoutq_free(&tp->t_outq); in tty_dealloc()
1121 seldrain(&tp->t_inpoll); in tty_dealloc()
1122 seldrain(&tp->t_outpoll); in tty_dealloc()
1123 knlist_clear(&tp->t_inpoll.si_note, 0); in tty_dealloc()
1124 knlist_clear(&tp->t_outpoll.si_note, 0); in tty_dealloc()
1125 knlist_destroy(&tp->t_inpoll.si_note); in tty_dealloc()
1126 knlist_destroy(&tp->t_outpoll.si_note); in tty_dealloc()
1128 cv_destroy(&tp->t_inwait); in tty_dealloc()
1129 cv_destroy(&tp->t_outwait); in tty_dealloc()
1130 cv_destroy(&tp->t_bgwait); in tty_dealloc()
1131 cv_destroy(&tp->t_dcdwait); in tty_dealloc()
1132 cv_destroy(&tp->t_outserwait); in tty_dealloc()
1134 if (tp->t_mtx == &tp->t_mtxobj) in tty_dealloc()
1135 mtx_destroy(&tp->t_mtxobj); in tty_dealloc()
1136 ttydevsw_free(tp); in tty_dealloc()
1137 free(tp, M_TTY); in tty_dealloc()
1141 tty_rel_free(struct tty *tp) in tty_rel_free() argument
1145 tty_assert_locked(tp); in tty_rel_free()
1148 if (tp->t_sessioncnt != 0 || (tp->t_flags & TF_ACTIVITY) != TF_GONE) { in tty_rel_free()
1150 tty_unlock(tp); in tty_rel_free()
1155 funsetown(&tp->t_sigio); in tty_rel_free()
1158 dev = tp->t_dev; in tty_rel_free()
1159 tp->t_dev = NULL; in tty_rel_free()
1160 tty_unlock(tp); in tty_rel_free()
1164 TAILQ_REMOVE(&tty_list, tp, t_list); in tty_rel_free()
1167 destroy_dev_sched_cb(dev, tty_dealloc, tp); in tty_rel_free()
1172 tty_rel_pgrp(struct tty *tp, struct pgrp *pg) in tty_rel_pgrp() argument
1175 MPASS(tp->t_sessioncnt > 0); in tty_rel_pgrp()
1176 tty_assert_locked(tp); in tty_rel_pgrp()
1178 if (tp->t_pgrp == pg) in tty_rel_pgrp()
1179 tp->t_pgrp = NULL; in tty_rel_pgrp()
1181 tty_unlock(tp); in tty_rel_pgrp()
1185 tty_rel_sess(struct tty *tp, struct session *sess) in tty_rel_sess() argument
1188 MPASS(tp->t_sessioncnt > 0); in tty_rel_sess()
1191 if (tp->t_session == sess) { in tty_rel_sess()
1192 tp->t_session = NULL; in tty_rel_sess()
1193 MPASS(tp->t_pgrp == NULL); in tty_rel_sess()
1195 tp->t_sessioncnt--; in tty_rel_sess()
1196 tty_rel_free(tp); in tty_rel_sess()
1200 tty_rel_gone(struct tty *tp) in tty_rel_gone() argument
1203 tty_assert_locked(tp); in tty_rel_gone()
1204 MPASS(!tty_gone(tp)); in tty_rel_gone()
1207 ttydisc_modem(tp, 0); in tty_rel_gone()
1210 tty_wakeup(tp, FREAD|FWRITE); in tty_rel_gone()
1211 cv_broadcast(&tp->t_bgwait); in tty_rel_gone()
1212 cv_broadcast(&tp->t_dcdwait); in tty_rel_gone()
1214 tp->t_flags |= TF_GONE; in tty_rel_gone()
1215 tty_rel_free(tp); in tty_rel_gone()
1219 tty_drop_ctty(struct tty *tp, struct proc *p) in tty_drop_ctty() argument
1232 tty_unlock(tp); in tty_drop_ctty()
1234 tty_lock(tp); in tty_drop_ctty()
1235 if (tty_gone(tp)) { in tty_drop_ctty()
1246 if (session->s_ttyp == NULL || session->s_ttyp != tp) { in tty_drop_ctty()
1264 tp->t_sessioncnt--; in tty_drop_ctty()
1288 tty_to_xtty(struct tty *tp, struct xtty *xt) in tty_to_xtty() argument
1291 tty_assert_locked(tp); in tty_to_xtty()
1295 xt->xt_insize = ttyinq_getsize(&tp->t_inq); in tty_to_xtty()
1296 xt->xt_incc = ttyinq_bytescanonicalized(&tp->t_inq); in tty_to_xtty()
1297 xt->xt_inlc = ttyinq_bytesline(&tp->t_inq); in tty_to_xtty()
1298 xt->xt_inlow = tp->t_inlow; in tty_to_xtty()
1299 xt->xt_outsize = ttyoutq_getsize(&tp->t_outq); in tty_to_xtty()
1300 xt->xt_outcc = ttyoutq_bytesused(&tp->t_outq); in tty_to_xtty()
1301 xt->xt_outlow = tp->t_outlow; in tty_to_xtty()
1302 xt->xt_column = tp->t_column; in tty_to_xtty()
1303 xt->xt_pgid = tp->t_pgrp ? tp->t_pgrp->pg_id : 0; in tty_to_xtty()
1304 xt->xt_sid = tp->t_session ? tp->t_session->s_sid : 0; in tty_to_xtty()
1305 xt->xt_flags = tp->t_flags; in tty_to_xtty()
1306 xt->xt_dev = tp->t_dev ? dev2udev(tp->t_dev) : (uint32_t)NODEV; in tty_to_xtty()
1315 struct tty *tp; in sysctl_kern_ttys() local
1329 TAILQ_FOREACH(tp, &tty_list, t_list) { in sysctl_kern_ttys()
1330 tty_lock(tp); in sysctl_kern_ttys()
1331 if (tp->t_session != NULL && in sysctl_kern_ttys()
1332 (p = atomic_load_ptr(&tp->t_session->s_leader)) != NULL) { in sysctl_kern_ttys()
1340 tty_to_xtty(tp, xt); in sysctl_kern_ttys()
1343 tty_unlock(tp); in sysctl_kern_ttys()
1366 tty_makedevf(struct tty *tp, struct ucred *cred, int flags, in tty_makedevf() argument
1380 if (tp->t_flags & TF_NOPREFIX) in tty_makedevf()
1410 args.mda_si_drv1 = tp; in tty_makedevf()
1414 tp->t_dev = dev; in tty_makedevf()
1419 if (tp->t_flags & TF_INITLOCK) { in tty_makedevf()
1422 args.mda_si_drv1 = tp; in tty_makedevf()
1423 args.mda_si_drv2 = &tp->t_termios_init_in; in tty_makedevf()
1430 args.mda_si_drv2 = &tp->t_termios_lock_in; in tty_makedevf()
1438 if (tp->t_flags & TF_CALLOUT) { in tty_makedevf()
1447 args.mda_si_drv1 = tp; in tty_makedevf()
1454 if (tp->t_flags & TF_INITLOCK) { in tty_makedevf()
1457 args.mda_si_drv2 = &tp->t_termios_init_out; in tty_makedevf()
1464 args.mda_si_drv2 = &tp->t_termios_lock_out; in tty_makedevf()
1473 TAILQ_INSERT_TAIL(&tty_list, tp, t_list); in tty_makedevf()
1498 tty_signal_sessleader(struct tty *tp, int sig) in tty_signal_sessleader() argument
1503 tty_assert_locked(tp); in tty_signal_sessleader()
1507 tp->t_flags &= ~TF_STOPPED; in tty_signal_sessleader()
1508 tp->t_termios.c_lflag &= ~FLUSHO; in tty_signal_sessleader()
1516 if ((s = tp->t_session) != NULL && in tty_signal_sessleader()
1525 tty_signal_pgrp(struct tty *tp, int sig) in tty_signal_pgrp() argument
1529 tty_assert_locked(tp); in tty_signal_pgrp()
1533 tp->t_flags &= ~TF_STOPPED; in tty_signal_pgrp()
1534 tp->t_termios.c_lflag &= ~FLUSHO; in tty_signal_pgrp()
1536 if (sig == SIGINFO && !(tp->t_termios.c_lflag & NOKERNINFO)) in tty_signal_pgrp()
1537 tty_info(tp); in tty_signal_pgrp()
1538 if (tp->t_pgrp != NULL) { in tty_signal_pgrp()
1542 PGRP_LOCK(tp->t_pgrp); in tty_signal_pgrp()
1543 pgsignal(tp->t_pgrp, sig, 1, &ksi); in tty_signal_pgrp()
1544 PGRP_UNLOCK(tp->t_pgrp); in tty_signal_pgrp()
1549 tty_wakeup(struct tty *tp, int flags) in tty_wakeup() argument
1552 if (tp->t_flags & TF_ASYNC && tp->t_sigio != NULL) in tty_wakeup()
1553 pgsigio(&tp->t_sigio, SIGIO, (tp->t_session != NULL)); in tty_wakeup()
1556 cv_broadcast(&tp->t_outwait); in tty_wakeup()
1557 selwakeup(&tp->t_outpoll); in tty_wakeup()
1558 KNOTE_LOCKED(&tp->t_outpoll.si_note, 0); in tty_wakeup()
1561 cv_broadcast(&tp->t_inwait); in tty_wakeup()
1562 selwakeup(&tp->t_inpoll); in tty_wakeup()
1563 KNOTE_LOCKED(&tp->t_inpoll.si_note, 0); in tty_wakeup()
1568 tty_wait(struct tty *tp, struct cv *cv) in tty_wait() argument
1571 int revokecnt = tp->t_revokecnt; in tty_wait()
1573 tty_lock_assert(tp, MA_OWNED|MA_NOTRECURSED); in tty_wait()
1574 MPASS(!tty_gone(tp)); in tty_wait()
1576 error = cv_wait_sig(cv, tp->t_mtx); in tty_wait()
1579 if (tty_gone(tp)) in tty_wait()
1583 if (tp->t_revokecnt != revokecnt) in tty_wait()
1590 tty_timedwait(struct tty *tp, struct cv *cv, int hz) in tty_timedwait() argument
1593 int revokecnt = tp->t_revokecnt; in tty_timedwait()
1595 tty_lock_assert(tp, MA_OWNED|MA_NOTRECURSED); in tty_timedwait()
1596 MPASS(!tty_gone(tp)); in tty_timedwait()
1598 error = cv_timedwait_sig(cv, tp->t_mtx, hz); in tty_timedwait()
1601 if (tty_gone(tp)) in tty_timedwait()
1605 if (tp->t_revokecnt != revokecnt) in tty_timedwait()
1612 tty_flush(struct tty *tp, int flags) in tty_flush() argument
1616 tp->t_flags &= ~TF_HIWAT_OUT; in tty_flush()
1617 ttyoutq_flush(&tp->t_outq); in tty_flush()
1618 tty_wakeup(tp, FWRITE); in tty_flush()
1619 if (!tty_gone(tp)) { in tty_flush()
1620 ttydevsw_outwakeup(tp); in tty_flush()
1621 ttydevsw_pktnotify(tp, TIOCPKT_FLUSHWRITE); in tty_flush()
1625 tty_hiwat_in_unblock(tp); in tty_flush()
1626 ttyinq_flush(&tp->t_inq); in tty_flush()
1627 tty_wakeup(tp, FREAD); in tty_flush()
1628 if (!tty_gone(tp)) { in tty_flush()
1629 ttydevsw_inwakeup(tp); in tty_flush()
1630 ttydevsw_pktnotify(tp, TIOCPKT_FLUSHREAD); in tty_flush()
1636 tty_set_winsize(struct tty *tp, const struct winsize *wsz) in tty_set_winsize() argument
1639 if (memcmp(&tp->t_winsize, wsz, sizeof(*wsz)) == 0) in tty_set_winsize()
1641 tp->t_winsize = *wsz; in tty_set_winsize()
1642 tty_signal_pgrp(tp, SIGWINCH); in tty_set_winsize()
1646 tty_sti_check(struct tty *tp, int fflag, struct thread *td) in tty_sti_check() argument
1657 if (!tty_is_ctty(tp, td->td_proc)) in tty_sti_check()
1664 tty_generic_ioctl(struct tty *tp, u_long cmd, void *data, int fflag, in tty_generic_ioctl() argument
1676 ttydevsw_modem(tp, SER_DTR, 0); in tty_generic_ioctl()
1679 ttydevsw_modem(tp, 0, SER_DTR); in tty_generic_ioctl()
1683 ttydevsw_modem(tp, in tty_generic_ioctl()
1690 ttydevsw_modem(tp, (bits & (TIOCM_DTR | TIOCM_RTS)) >> 1, 0); in tty_generic_ioctl()
1695 ttydevsw_modem(tp, 0, (bits & (TIOCM_DTR | TIOCM_RTS)) >> 1); in tty_generic_ioctl()
1699 *(int *)data = TIOCM_LE + (ttydevsw_modem(tp, 0, 0) << 1); in tty_generic_ioctl()
1704 tp->t_flags |= TF_ASYNC; in tty_generic_ioctl()
1706 tp->t_flags &= ~TF_ASYNC; in tty_generic_ioctl()
1712 *(int *)data = ttydisc_bytesavail(tp); in tty_generic_ioctl()
1716 *(int *)data = ttyoutq_bytesused(&tp->t_outq); in tty_generic_ioctl()
1719 if (tp->t_session != NULL && !tty_is_ctty(tp, td->td_proc)) in tty_generic_ioctl()
1724 tty_unlock(tp); in tty_generic_ioctl()
1725 error = fsetown(*(int *)data, &tp->t_sigio); in tty_generic_ioctl()
1726 tty_lock(tp); in tty_generic_ioctl()
1729 if (tp->t_session != NULL && !tty_is_ctty(tp, td->td_proc)) in tty_generic_ioctl()
1734 *(int *)data = fgetown(&tp->t_sigio); in tty_generic_ioctl()
1738 *(struct termios*)data = tp->t_termios; in tty_generic_ioctl()
1762 error = tty_drain(tp, 0); in tty_generic_ioctl()
1766 tty_flush(tp, FREAD); in tty_generic_ioctl()
1773 (tp->t_termios.c_cflag != t->c_cflag || in tty_generic_ioctl()
1774 ((tp->t_termios.c_iflag ^ t->c_iflag) & in tty_generic_ioctl()
1776 tp->t_termios.c_ispeed != t->c_ispeed || in tty_generic_ioctl()
1777 tp->t_termios.c_ospeed != t->c_ospeed)) { in tty_generic_ioctl()
1778 error = ttydevsw_param(tp, t); in tty_generic_ioctl()
1784 tp->t_termios.c_cflag = t->c_cflag & ~CIGNORE; in tty_generic_ioctl()
1785 tp->t_termios.c_ispeed = t->c_ispeed; in tty_generic_ioctl()
1786 tp->t_termios.c_ospeed = t->c_ospeed; in tty_generic_ioctl()
1789 error = tty_watermarks(tp); in tty_generic_ioctl()
1801 if ((t->c_lflag & ICANON) != (tp->t_termios.c_lflag & ICANON)) in tty_generic_ioctl()
1803 else if (tp->t_termios.c_cc[VEOF] != t->c_cc[VEOF] || in tty_generic_ioctl()
1804 tp->t_termios.c_cc[VEOL] != t->c_cc[VEOL]) in tty_generic_ioctl()
1808 tp->t_termios.c_iflag = t->c_iflag; in tty_generic_ioctl()
1809 tp->t_termios.c_oflag = t->c_oflag; in tty_generic_ioctl()
1810 tp->t_termios.c_lflag = t->c_lflag; in tty_generic_ioctl()
1811 memcpy(&tp->t_termios.c_cc, t->c_cc, sizeof t->c_cc); in tty_generic_ioctl()
1813 ttydisc_optimize(tp); in tty_generic_ioctl()
1816 ttydisc_canonicalize(tp); in tty_generic_ioctl()
1824 tty_wakeup(tp, FREAD); in tty_generic_ioctl()
1831 if (tp->t_termios.c_iflag & IXON && in tty_generic_ioctl()
1832 tp->t_termios.c_cc[VSTOP] == CTRL('S') && in tty_generic_ioctl()
1833 tp->t_termios.c_cc[VSTART] == CTRL('Q')) in tty_generic_ioctl()
1834 ttydevsw_pktnotify(tp, TIOCPKT_DOSTOP); in tty_generic_ioctl()
1836 ttydevsw_pktnotify(tp, TIOCPKT_NOSTOP); in tty_generic_ioctl()
1844 if (!tty_is_ctty(tp, td->td_proc)) in tty_generic_ioctl()
1847 if (tp->t_pgrp != NULL) in tty_generic_ioctl()
1848 *(int *)data = tp->t_pgrp->pg_id; in tty_generic_ioctl()
1853 if (!tty_is_ctty(tp, td->td_proc)) in tty_generic_ioctl()
1856 MPASS(tp->t_session); in tty_generic_ioctl()
1857 *(int *)data = tp->t_session->s_sid; in tty_generic_ioctl()
1860 return (tty_drop_ctty(tp, td->td_proc)); in tty_generic_ioctl()
1865 tty_unlock(tp); in tty_generic_ioctl()
1867 tty_lock(tp); in tty_generic_ioctl()
1875 if (tp->t_session != NULL && tp->t_session == p->p_session) { in tty_generic_ioctl()
1882 (tp->t_session != NULL && tp->t_session->s_ttyvp != NULL && in tty_generic_ioctl()
1883 tp->t_session->s_ttyvp->v_type != VBAD)) { in tty_generic_ioctl()
1900 tp->t_session = p->p_session; in tty_generic_ioctl()
1901 tp->t_session->s_ttyp = tp; in tty_generic_ioctl()
1902 tp->t_sessioncnt++; in tty_generic_ioctl()
1905 tp->t_pgrp = p->p_pgrp; in tty_generic_ioctl()
1921 tty_unlock(tp); in tty_generic_ioctl()
1928 tty_lock(tp); in tty_generic_ioctl()
1931 tty_lock(tp); in tty_generic_ioctl()
1937 if (!tty_is_ctty(tp, td->td_proc)) { in tty_generic_ioctl()
1941 tp->t_pgrp = pg; in tty_generic_ioctl()
1945 cv_broadcast(&tp->t_bgwait); in tty_generic_ioctl()
1955 tty_flush(tp, flags); in tty_generic_ioctl()
1960 return tty_drain(tp, 0); in tty_generic_ioctl()
1962 *(int *)data = tp->t_drainwait; in tty_generic_ioctl()
1967 tp->t_drainwait = *(int *)data; in tty_generic_ioctl()
1975 error = constty_set(tp); in tty_generic_ioctl()
1977 error = constty_clear(tp); in tty_generic_ioctl()
1982 *(struct winsize*)data = tp->t_winsize; in tty_generic_ioctl()
1986 tty_set_winsize(tp, data); in tty_generic_ioctl()
1989 tp->t_flags |= TF_EXCLUDE; in tty_generic_ioctl()
1992 tp->t_flags &= ~TF_EXCLUDE; in tty_generic_ioctl()
1995 tp->t_flags |= TF_STOPPED; in tty_generic_ioctl()
1996 ttydevsw_pktnotify(tp, TIOCPKT_STOP); in tty_generic_ioctl()
1999 tp->t_flags &= ~TF_STOPPED; in tty_generic_ioctl()
2000 tp->t_termios.c_lflag &= ~FLUSHO; in tty_generic_ioctl()
2001 ttydevsw_outwakeup(tp); in tty_generic_ioctl()
2002 ttydevsw_pktnotify(tp, TIOCPKT_START); in tty_generic_ioctl()
2005 tty_info(tp); in tty_generic_ioctl()
2008 error = tty_sti_check(tp, fflag, td); in tty_generic_ioctl()
2011 ttydisc_rint(tp, *(char *)data, 0); in tty_generic_ioctl()
2012 ttydisc_rint_done(tp); in tty_generic_ioctl()
2017 return tty_ioctl_compat(tp, cmd, data, fflag, td); in tty_generic_ioctl()
2024 tty_ioctl(struct tty *tp, u_long cmd, void *data, int fflag, struct thread *td) in tty_ioctl() argument
2028 tty_assert_locked(tp); in tty_ioctl()
2030 if (tty_gone(tp)) in tty_ioctl()
2033 error = ttydevsw_ioctl(tp, cmd, data, td); in tty_ioctl()
2035 error = tty_generic_ioctl(tp, cmd, data, fflag, td); in tty_ioctl()
2041 tty_udev(struct tty *tp) in tty_udev() argument
2044 if (tp->t_dev) in tty_udev()
2045 return (dev2udev(tp->t_dev)); in tty_udev()
2051 tty_checkoutq(struct tty *tp) in tty_checkoutq() argument
2055 return (ttyoutq_bytesleft(&tp->t_outq) >= 256); in tty_checkoutq()
2059 tty_hiwat_in_block(struct tty *tp) in tty_hiwat_in_block() argument
2062 if ((tp->t_flags & TF_HIWAT_IN) == 0 && in tty_hiwat_in_block()
2063 tp->t_termios.c_iflag & IXOFF && in tty_hiwat_in_block()
2064 tp->t_termios.c_cc[VSTOP] != _POSIX_VDISABLE) { in tty_hiwat_in_block()
2069 if (ttyoutq_write_nofrag(&tp->t_outq, in tty_hiwat_in_block()
2070 &tp->t_termios.c_cc[VSTOP], 1) == 0) in tty_hiwat_in_block()
2071 tp->t_flags |= TF_HIWAT_IN; in tty_hiwat_in_block()
2074 tp->t_flags |= TF_HIWAT_IN; in tty_hiwat_in_block()
2079 tty_hiwat_in_unblock(struct tty *tp) in tty_hiwat_in_unblock() argument
2082 if (tp->t_flags & TF_HIWAT_IN && in tty_hiwat_in_unblock()
2083 tp->t_termios.c_iflag & IXOFF && in tty_hiwat_in_unblock()
2084 tp->t_termios.c_cc[VSTART] != _POSIX_VDISABLE) { in tty_hiwat_in_unblock()
2089 if (ttyoutq_write_nofrag(&tp->t_outq, in tty_hiwat_in_unblock()
2090 &tp->t_termios.c_cc[VSTART], 1) == 0) in tty_hiwat_in_unblock()
2091 tp->t_flags &= ~TF_HIWAT_IN; in tty_hiwat_in_unblock()
2094 tp->t_flags &= ~TF_HIWAT_IN; in tty_hiwat_in_unblock()
2097 if (!tty_gone(tp)) in tty_hiwat_in_unblock()
2098 ttydevsw_inwakeup(tp); in tty_hiwat_in_unblock()
2106 ttyhook_defrint(struct tty *tp, char c, int flags) in ttyhook_defrint() argument
2109 if (ttyhook_rint_bypass(tp, &c, 1) != 1) in ttyhook_defrint()
2119 struct tty *tp; in ttyhook_register() local
2172 tp = dev->si_drv1; in ttyhook_register()
2176 tty_lock(tp); in ttyhook_register()
2177 MPASS((tp->t_hook == NULL) == ((tp->t_flags & TF_HOOK) == 0)); in ttyhook_register()
2178 if (tp->t_flags & TF_HOOK) in ttyhook_register()
2181 tp->t_flags |= TF_HOOK; in ttyhook_register()
2182 tp->t_hook = th; in ttyhook_register()
2183 tp->t_hooksoftc = softc; in ttyhook_register()
2184 *rtp = tp; in ttyhook_register()
2188 ttydisc_optimize(tp); in ttyhook_register()
2191 if (!ttyhook_hashook(tp, rint) && ttyhook_hashook(tp, rint_bypass)) in ttyhook_register()
2194 done3: tty_unlock(tp); in ttyhook_register()
2201 ttyhook_unregister(struct tty *tp) in ttyhook_unregister() argument
2204 tty_assert_locked(tp); in ttyhook_unregister()
2205 MPASS(tp->t_flags & TF_HOOK); in ttyhook_unregister()
2208 tp->t_flags &= ~TF_HOOK; in ttyhook_unregister()
2209 tp->t_hook = NULL; in ttyhook_unregister()
2212 ttydisc_optimize(tp); in ttyhook_unregister()
2215 tty_rel_free(tp); in ttyhook_unregister()
2225 struct tty *tp; in ttyconsdev_open() local
2233 TAILQ_FOREACH(tp, &tty_list, t_list) { in ttyconsdev_open()
2234 if (strcmp(dev_console_filename, tty_devname(tp)) == 0) { in ttyconsdev_open()
2235 dev_console->si_drv1 = tp; in ttyconsdev_open()
2405 struct tty *tp; in DB_SHOW_COMMAND() local
2411 tp = (struct tty *)addr; in DB_SHOW_COMMAND()
2413 db_printf("%p: %s\n", tp, tty_devname(tp)); in DB_SHOW_COMMAND()
2414 db_printf("\tmtx: %p\n", tp->t_mtx); in DB_SHOW_COMMAND()
2415 db_printf("\tflags: 0x%b\n", tp->t_flags, TTY_FLAG_BITS); in DB_SHOW_COMMAND()
2416 db_printf("\trevokecnt: %u\n", tp->t_revokecnt); in DB_SHOW_COMMAND()
2420 "nblocks %u quota %u\n", &tp->t_inq, tp->t_inq.ti_begin, in DB_SHOW_COMMAND()
2421 tp->t_inq.ti_linestart, tp->t_inq.ti_reprint, tp->t_inq.ti_end, in DB_SHOW_COMMAND()
2422 tp->t_inq.ti_nblocks, tp->t_inq.ti_quota); in DB_SHOW_COMMAND()
2424 &tp->t_outq, tp->t_outq.to_begin, tp->t_outq.to_end, in DB_SHOW_COMMAND()
2425 tp->t_outq.to_nblocks, tp->t_outq.to_quota); in DB_SHOW_COMMAND()
2426 db_printf("\tinlow: %zu\n", tp->t_inlow); in DB_SHOW_COMMAND()
2427 db_printf("\toutlow: %zu\n", tp->t_outlow); in DB_SHOW_COMMAND()
2428 _db_show_termios("\ttermios", &tp->t_termios); in DB_SHOW_COMMAND()
2430 tp->t_winsize.ws_row, tp->t_winsize.ws_col, in DB_SHOW_COMMAND()
2431 tp->t_winsize.ws_xpixel, tp->t_winsize.ws_ypixel); in DB_SHOW_COMMAND()
2432 db_printf("\tcolumn: %u\n", tp->t_column); in DB_SHOW_COMMAND()
2433 db_printf("\twritepos: %u\n", tp->t_writepos); in DB_SHOW_COMMAND()
2434 db_printf("\tcompatflags: 0x%x\n", tp->t_compatflags); in DB_SHOW_COMMAND()
2437 _db_show_termios("\ttermios_init_in", &tp->t_termios_init_in); in DB_SHOW_COMMAND()
2438 _db_show_termios("\ttermios_init_out", &tp->t_termios_init_out); in DB_SHOW_COMMAND()
2439 _db_show_termios("\ttermios_lock_in", &tp->t_termios_lock_in); in DB_SHOW_COMMAND()
2440 _db_show_termios("\ttermios_lock_out", &tp->t_termios_lock_out); in DB_SHOW_COMMAND()
2443 _db_show_devsw("\t", tp->t_devsw); in DB_SHOW_COMMAND()
2444 _db_show_hooks("\t", tp->t_hook); in DB_SHOW_COMMAND()
2447 db_printf("\tpgrp: %p gid %d\n", tp->t_pgrp, in DB_SHOW_COMMAND()
2448 tp->t_pgrp ? tp->t_pgrp->pg_id : 0); in DB_SHOW_COMMAND()
2449 db_printf("\tsession: %p", tp->t_session); in DB_SHOW_COMMAND()
2450 if (tp->t_session != NULL) in DB_SHOW_COMMAND()
2452 tp->t_session->s_count, tp->t_session->s_leader, in DB_SHOW_COMMAND()
2453 tp->t_session->s_ttyp, tp->t_session->s_sid, in DB_SHOW_COMMAND()
2454 tp->t_session->s_login); in DB_SHOW_COMMAND()
2456 db_printf("\tsessioncnt: %u\n", tp->t_sessioncnt); in DB_SHOW_COMMAND()
2457 db_printf("\tdevswsoftc: %p\n", tp->t_devswsoftc); in DB_SHOW_COMMAND()
2458 db_printf("\thooksoftc: %p\n", tp->t_hooksoftc); in DB_SHOW_COMMAND()
2459 db_printf("\tdev: %p\n", tp->t_dev); in DB_SHOW_COMMAND()
2465 struct tty *tp; in DB_SHOW_ALL_COMMAND() local
2477 TAILQ_FOREACH(tp, &tty_list, t_list) { in DB_SHOW_ALL_COMMAND()
2478 isiz = tp->t_inq.ti_nblocks * TTYINQ_DATASIZE; in DB_SHOW_ALL_COMMAND()
2479 osiz = tp->t_outq.to_nblocks * TTYOUTQ_DATASIZE; in DB_SHOW_ALL_COMMAND()
2482 "%5d ", tp, tty_devname(tp), isiz, in DB_SHOW_ALL_COMMAND()
2483 tp->t_inq.ti_linestart - tp->t_inq.ti_begin, in DB_SHOW_ALL_COMMAND()
2484 tp->t_inq.ti_end - tp->t_inq.ti_linestart, in DB_SHOW_ALL_COMMAND()
2485 isiz - tp->t_inlow, osiz, in DB_SHOW_ALL_COMMAND()
2486 tp->t_outq.to_end - tp->t_outq.to_begin, in DB_SHOW_ALL_COMMAND()
2487 osiz - tp->t_outlow, MIN(tp->t_column, 99999), in DB_SHOW_ALL_COMMAND()
2488 tp->t_session ? tp->t_session->s_sid : 0, in DB_SHOW_ALL_COMMAND()
2489 tp->t_pgrp ? tp->t_pgrp->pg_id : 0); in DB_SHOW_ALL_COMMAND()
2493 if (tp->t_flags & ttystates[i].flag) { in DB_SHOW_ALL_COMMAND()