Lines Matching refs:td

105 static int	killpg1(struct thread *td, int sig, int pgid, int all,
107 static int issignal(struct thread *td);
117 static void sigfastblock_setpend(struct thread *td, bool resched);
118 static void sig_handle_first_stop(struct thread *td, struct proc *p,
288 ast_sig(struct thread *td, int tda) in ast_sig() argument
294 p = td->td_proc; in ast_sig()
300 thread_lock(td); in ast_sig()
309 (td->td_pflags & TDP_SIGFASTBLOCK) == 0) { in ast_sig()
310 if (SIGPENDING(td) && ((tda | td->td_ast) & in ast_sig()
312 thread_unlock(td); /* fix dumps */ in ast_sig()
316 p, td, tda, td->td_ast, td->td_flags); in ast_sig()
319 thread_unlock(td); in ast_sig()
331 sigfastblock_fetch(td); in ast_sig()
333 old_boundary = ~TDB_BOUNDARY | (td->td_dbgflags & TDB_BOUNDARY); in ast_sig()
334 td->td_dbgflags |= TDB_BOUNDARY; in ast_sig()
336 while ((sig = cursig(td)) != 0) { in ast_sig()
341 td->td_dbgflags &= old_boundary; in ast_sig()
352 sigfastblock_setpend(td, resched_sigs); in ast_sig()
360 td->td_sa.code = 0; in ast_sig()
364 ast_sigsuspend(struct thread *td, int tda __unused) in ast_sigsuspend() argument
366 MPASS((td->td_pflags & TDP_OLDMASK) != 0); in ast_sigsuspend()
367 td->td_pflags &= ~TDP_OLDMASK; in ast_sigsuspend()
368 kern_sigprocmask(td, SIG_SETMASK, &td->td_oldsigmask, NULL, 0); in ast_sigsuspend()
734 cursig(struct thread *td) in cursig() argument
736 PROC_LOCK_ASSERT(td->td_proc, MA_OWNED); in cursig()
737 mtx_assert(&td->td_proc->p_sigacts->ps_mtx, MA_OWNED); in cursig()
738 THREAD_LOCK_ASSERT(td, MA_NOTOWNED); in cursig()
739 return (SIGPENDING(td) ? issignal(td) : 0); in cursig()
748 signotify(struct thread *td) in signotify() argument
751 PROC_LOCK_ASSERT(td->td_proc, MA_OWNED); in signotify()
753 if (SIGPENDING(td)) in signotify()
754 ast_sched(td, TDA_SIG); in signotify()
765 struct thread *td; in sigonstack() local
767 td = curthread; in sigonstack()
768 if ((td->td_pflags & TDP_ALTSTACK) == 0) in sigonstack()
771 if (SV_PROC_FLAG(td->td_proc, SV_AOUT) && td->td_sigstk.ss_size == 0) in sigonstack()
772 return ((td->td_sigstk.ss_flags & SS_ONSTACK) != 0); in sigonstack()
774 return (sp >= (size_t)td->td_sigstk.ss_sp && in sigonstack()
775 sp < td->td_sigstk.ss_size + (size_t)td->td_sigstk.ss_sp); in sigonstack()
808 kern_sigaction(struct thread *td, int sig, const struct sigaction *act, in kern_sigaction() argument
812 struct proc *p = td->td_proc; in kern_sigaction()
960 sys_sigaction(struct thread *td, struct sigaction_args *uap) in sys_sigaction() argument
973 error = kern_sigaction(td, uap->sig, actp, oactp, 0); in sys_sigaction()
988 freebsd4_sigaction(struct thread *td, struct freebsd4_sigaction_args *uap) in freebsd4_sigaction() argument
1001 error = kern_sigaction(td, uap->sig, actp, oactp, KSA_FREEBSD4); in freebsd4_sigaction()
1017 osigaction(struct thread *td, struct osigaction_args *uap) in osigaction() argument
1038 error = kern_sigaction(td, uap->signum, nsap, osap, KSA_OSIGSET); in osigaction()
1051 osigreturn(struct thread *td, struct osigreturn_args *uap) in osigreturn() argument
1053 return (kern_nosys(td, 0)); in osigreturn()
1102 struct thread *td; in execsigs() local
1118 td = curthread; in execsigs()
1119 MPASS(td->td_proc == p); in execsigs()
1120 td->td_sigstk.ss_flags = SS_DISABLE; in execsigs()
1121 td->td_sigstk.ss_size = 0; in execsigs()
1122 td->td_sigstk.ss_sp = 0; in execsigs()
1123 td->td_pflags &= ~TDP_ALTSTACK; in execsigs()
1139 kern_sigprocmask(struct thread *td, int how, sigset_t *set, sigset_t *oset, in kern_sigprocmask() argument
1146 p = td->td_proc; in kern_sigprocmask()
1154 *oset = td->td_sigmask; in kern_sigprocmask()
1161 oset1 = td->td_sigmask; in kern_sigprocmask()
1162 SIGSETOR(td->td_sigmask, *set); in kern_sigprocmask()
1163 new_block = td->td_sigmask; in kern_sigprocmask()
1167 SIGSETNAND(td->td_sigmask, *set); in kern_sigprocmask()
1168 signotify(td); in kern_sigprocmask()
1172 oset1 = td->td_sigmask; in kern_sigprocmask()
1174 SIGSETLO(td->td_sigmask, *set); in kern_sigprocmask()
1176 td->td_sigmask = *set; in kern_sigprocmask()
1177 new_block = td->td_sigmask; in kern_sigprocmask()
1179 signotify(td); in kern_sigprocmask()
1213 sys_sigprocmask(struct thread *td, struct sigprocmask_args *uap) in sys_sigprocmask() argument
1226 error = kern_sigprocmask(td, uap->how, setp, osetp, 0); in sys_sigprocmask()
1241 osigprocmask(struct thread *td, struct osigprocmask_args *uap) in osigprocmask() argument
1247 error = kern_sigprocmask(td, uap->how, &set, &oset, 1); in osigprocmask()
1248 SIG2OSIG(oset, td->td_retval[0]); in osigprocmask()
1254 sys_sigwait(struct thread *td, struct sigwait_args *uap) in sys_sigwait() argument
1262 td->td_retval[0] = error; in sys_sigwait()
1266 error = kern_sigtimedwait(td, set, &ksi, NULL); in sys_sigwait()
1275 if (error == EINTR && td->td_proc->p_osrel < P_OSREL_SIGWAIT) in sys_sigwait()
1277 td->td_retval[0] = error; in sys_sigwait()
1282 td->td_retval[0] = error; in sys_sigwait()
1287 sys_sigtimedwait(struct thread *td, struct sigtimedwait_args *uap) in sys_sigtimedwait() argument
1308 error = kern_sigtimedwait(td, set, &ksi, timeout); in sys_sigtimedwait()
1316 td->td_retval[0] = ksi.ksi_signo; in sys_sigtimedwait()
1321 sys_sigwaitinfo(struct thread *td, struct sigwaitinfo_args *uap) in sys_sigwaitinfo() argument
1331 error = kern_sigtimedwait(td, set, &ksi, NULL); in sys_sigwaitinfo()
1339 td->td_retval[0] = ksi.ksi_signo; in sys_sigwaitinfo()
1344 proc_td_siginfo_capture(struct thread *td, siginfo_t *si) in proc_td_siginfo_capture() argument
1348 FOREACH_THREAD_IN_PROC(td->td_proc, thr) { in proc_td_siginfo_capture()
1349 if (thr == td) in proc_td_siginfo_capture()
1357 kern_sigtimedwait(struct thread *td, sigset_t waitset, ksiginfo_t *ksi, in kern_sigtimedwait() argument
1368 p = td->td_proc; in kern_sigtimedwait()
1373 sigfastblock_fetch(td); in kern_sigtimedwait()
1396 saved_mask = td->td_sigmask; in kern_sigtimedwait()
1397 SIGSETNAND(td->td_sigmask, waitset); in kern_sigtimedwait()
1400 thread_lock(td); in kern_sigtimedwait()
1401 td->td_flags |= TDF_SIGWAIT; in kern_sigtimedwait()
1402 thread_unlock(td); in kern_sigtimedwait()
1406 sig = cursig(td); in kern_sigtimedwait()
1410 if (sigqueue_get(&td->td_sigqueue, sig, ksi) != 0 || in kern_sigtimedwait()
1451 thread_lock(td); in kern_sigtimedwait()
1452 td->td_flags &= ~TDF_SIGWAIT; in kern_sigtimedwait()
1453 thread_unlock(td); in kern_sigtimedwait()
1456 SIGSETNAND(new_block, td->td_sigmask); in kern_sigtimedwait()
1457 td->td_sigmask = saved_mask; in kern_sigtimedwait()
1472 if (KTRPOINT(td, KTR_PSIG)) { in kern_sigtimedwait()
1478 ktrpsig(sig, action, &td->td_sigmask, ksi->ksi_code); in kern_sigtimedwait()
1482 proc_td_siginfo_capture(td, &ksi->ksi_info); in kern_sigtimedwait()
1483 sigexit(td, sig); in kern_sigtimedwait()
1496 sys_sigpending(struct thread *td, struct sigpending_args *uap) in sys_sigpending() argument
1498 struct proc *p = td->td_proc; in sys_sigpending()
1503 SIGSETOR(pending, td->td_sigqueue.sq_signals); in sys_sigpending()
1515 osigpending(struct thread *td, struct osigpending_args *uap) in osigpending() argument
1517 struct proc *p = td->td_proc; in osigpending()
1522 SIGSETOR(pending, td->td_sigqueue.sq_signals); in osigpending()
1524 SIG2OSIG(pending, td->td_retval[0]); in osigpending()
1542 osigvec(struct thread *td, struct osigvec_args *uap) in osigvec() argument
1562 error = kern_sigaction(td, uap->signum, nsap, osap, KSA_OSIGSET); in osigvec()
1580 osigblock(struct thread *td, struct osigblock_args *uap) in osigblock() argument
1585 kern_sigprocmask(td, SIG_BLOCK, &set, &oset, 0); in osigblock()
1586 SIG2OSIG(oset, td->td_retval[0]); in osigblock()
1596 osigsetmask(struct thread *td, struct osigsetmask_args *uap) in osigsetmask() argument
1601 kern_sigprocmask(td, SIG_SETMASK, &set, &oset, 0); in osigsetmask()
1602 SIG2OSIG(oset, td->td_retval[0]); in osigsetmask()
1618 sys_sigsuspend(struct thread *td, struct sigsuspend_args *uap) in sys_sigsuspend() argument
1626 return (kern_sigsuspend(td, mask)); in sys_sigsuspend()
1630 kern_sigsuspend(struct thread *td, sigset_t mask) in kern_sigsuspend() argument
1632 struct proc *p = td->td_proc; in kern_sigsuspend()
1636 sigfastblock_fetch(td); in kern_sigsuspend()
1646 kern_sigprocmask(td, SIG_SETMASK, &mask, &td->td_oldsigmask, in kern_sigsuspend()
1648 td->td_pflags |= TDP_OLDMASK; in kern_sigsuspend()
1649 ast_sched(td, TDA_SIGSUSPEND); in kern_sigsuspend()
1657 (p->p_sysent->sv_set_syscall_retval)(td, EINTR); in kern_sigsuspend()
1664 while ((sig = cursig(td)) != 0) { in kern_sigsuspend()
1679 td->td_errno = EINTR; in kern_sigsuspend()
1680 td->td_pflags |= TDP_NERRNO; in kern_sigsuspend()
1696 osigsuspend(struct thread *td, struct osigsuspend_args *uap) in osigsuspend() argument
1701 return (kern_sigsuspend(td, mask)); in osigsuspend()
1714 osigstack(struct thread *td, struct osigstack_args *uap) in osigstack() argument
1724 oss.ss_sp = td->td_sigstk.ss_sp; in osigstack()
1725 oss.ss_onstack = sigonstack(cpu_getstack(td)); in osigstack()
1727 td->td_sigstk.ss_sp = nss.ss_sp; in osigstack()
1728 td->td_sigstk.ss_size = 0; in osigstack()
1729 td->td_sigstk.ss_flags |= nss.ss_onstack & SS_ONSTACK; in osigstack()
1730 td->td_pflags |= TDP_ALTSTACK; in osigstack()
1747 sys_sigaltstack(struct thread *td, struct sigaltstack_args *uap) in sys_sigaltstack() argument
1757 error = kern_sigaltstack(td, (uap->ss != NULL) ? &ss : NULL, in sys_sigaltstack()
1767 kern_sigaltstack(struct thread *td, stack_t *ss, stack_t *oss) in kern_sigaltstack() argument
1769 struct proc *p = td->td_proc; in kern_sigaltstack()
1772 oonstack = sigonstack(cpu_getstack(td)); in kern_sigaltstack()
1775 *oss = td->td_sigstk; in kern_sigaltstack()
1776 oss->ss_flags = (td->td_pflags & TDP_ALTSTACK) in kern_sigaltstack()
1789 td->td_sigstk = *ss; in kern_sigaltstack()
1790 td->td_pflags |= TDP_ALTSTACK; in kern_sigaltstack()
1792 td->td_pflags &= ~TDP_ALTSTACK; in kern_sigaltstack()
1799 struct thread *td; member
1812 err = p_cansignal(arg->td, p, arg->sig); in killpg1_sendsig_locked()
1828 (notself && p == arg->td->td_proc) || p->p_state == PRS_NEW) in killpg1_sendsig()
1842 (p == ctx->td->td_proc) || p->p_state == PRS_NEW) in kill_processes_prison_cb()
1853 killpg1(struct thread *td, int sig, int pgid, int all, ksiginfo_t *ksi) in killpg1() argument
1859 arg.td = td; in killpg1()
1869 prison_proc_iterate(td->td_ucred->cr_prison, in killpg1()
1878 pgrp = td->td_proc->p_pgrp; in killpg1()
1914 sys_kill(struct thread *td, struct kill_args *uap) in sys_kill() argument
1917 return (kern_kill(td, uap->pid, uap->signum)); in sys_kill()
1921 kern_kill(struct thread *td, pid_t pid, int signum) in kern_kill() argument
1932 if (pid != td->td_proc->p_pid) { in kern_kill()
1933 if (CAP_TRACING(td)) in kern_kill()
1935 if (IN_CAPABILITY_MODE(td)) in kern_kill()
1947 ksi.ksi_pid = td->td_proc->p_pid; in kern_kill()
1948 ksi.ksi_uid = td->td_ucred->cr_ruid; in kern_kill()
1955 error = p_cansignal(td, p, signum); in kern_kill()
1963 return (killpg1(td, signum, 0, 1, &ksi)); in kern_kill()
1965 return (killpg1(td, signum, 0, 0, &ksi)); in kern_kill()
1967 return (killpg1(td, signum, -pid, 0, &ksi)); in kern_kill()
1973 sys_pdkill(struct thread *td, struct pdkill_args *uap) in sys_pdkill() argument
1983 error = procdesc_find(td, uap->fd, &cap_pdkill_rights, &p); in sys_pdkill()
1987 error = p_cansignal(td, p, uap->signum); in sys_pdkill()
2003 okillpg(struct thread *td, struct okillpg_args *uap) in okillpg() argument
2015 ksi.ksi_pid = td->td_proc->p_pid; in okillpg()
2016 ksi.ksi_uid = td->td_ucred->cr_ruid; in okillpg()
2017 return (killpg1(td, uap->signum, uap->pgid, 0, &ksi)); in okillpg()
2029 sys_sigqueue(struct thread *td, struct sigqueue_args *uap) in sys_sigqueue() argument
2035 return (kern_sigqueue(td, uap->pid, uap->signum, &sv)); in sys_sigqueue()
2039 kern_sigqueue(struct thread *td, pid_t pid, int signumf, union sigval *value) in kern_sigqueue() argument
2063 p = td->td_proc; in kern_sigqueue()
2069 error = p_cansignal(td, p, signum); in kern_sigqueue()
2075 ksi.ksi_pid = td->td_proc->p_pid; in kern_sigqueue()
2076 ksi.ksi_uid = td->td_ucred->cr_ruid; in kern_sigqueue()
2112 postsig_done(int sig, struct thread *td, struct sigacts *ps) in postsig_done() argument
2117 td->td_ru.ru_nsignals++; in postsig_done()
2121 kern_sigprocmask(td, SIG_BLOCK, &mask, NULL, in postsig_done()
2133 trapsignal(struct thread *td, ksiginfo_t *ksi) in trapsignal() argument
2140 p = td->td_proc; in trapsignal()
2144 sigfastblock_fetch(td); in trapsignal()
2148 sigmask = td->td_sigmask; in trapsignal()
2149 if (td->td_sigblock_val != 0) in trapsignal()
2156 &td->td_sigmask, ksi->ksi_code); in trapsignal()
2159 ksi, &td->td_sigmask); in trapsignal()
2160 postsig_done(sig, td, ps); in trapsignal()
2170 SIGDELSET(td->td_sigmask, sig); in trapsignal()
2174 td->td_pflags &= ~TDP_SIGFASTBLOCK; in trapsignal()
2175 td->td_sigblock_val = 0; in trapsignal()
2179 tdsendsignal(p, td, sig, ksi); in trapsignal()
2187 struct thread *td, *signal_td; in sigtd() local
2202 FOREACH_THREAD_IN_PROC(p, td) { in sigtd()
2203 if (!SIGISMEMBER(td->td_sigmask, sig) && (!fast_sigblock || in sigtd()
2204 td != curthread || td->td_sigblock_val == 0) && in sigtd()
2205 (td->td_flags & TDF_BOUNDARY) == 0) { in sigtd()
2206 signal_td = td; in sigtd()
2255 struct thread *td; in sigev_findtd() local
2258 td = tdfind(sigev->sigev_notify_thread_id, p->p_pid); in sigev_findtd()
2259 if (td == NULL) in sigev_findtd()
2261 *ttd = td; in sigev_findtd()
2270 tdsignal(struct thread *td, int sig) in tdsignal() argument
2277 (void) tdsendsignal(td->td_proc, td, sig, &ksi); in tdsignal()
2281 tdksignal(struct thread *td, int sig, ksiginfo_t *ksi) in tdksignal() argument
2284 (void) tdsendsignal(td->td_proc, td, sig, ksi); in tdksignal()
2288 sig_sleepq_abort(struct thread *td, int intrval) in sig_sleepq_abort() argument
2290 THREAD_LOCK_ASSERT(td, MA_OWNED); in sig_sleepq_abort()
2292 if (intrval == 0 && (td->td_flags & TDF_SIGWAIT) == 0) in sig_sleepq_abort()
2293 thread_unlock(td); in sig_sleepq_abort()
2295 sleepq_abort(td, intrval); in sig_sleepq_abort()
2299 tdsendsignal(struct proc *p, struct thread *td, int sig, ksiginfo_t *ksi) in tdsendsignal() argument
2306 MPASS(td == NULL || p == td->td_proc); in tdsendsignal()
2327 if (td == NULL) { in tdsendsignal()
2328 td = sigtd(p, sig, false); in tdsendsignal()
2331 sigqueue = &td->td_sigqueue; in tdsendsignal()
2333 SDT_PROBE3(proc, , , signal__send, td, p, sig); in tdsendsignal()
2345 SDT_PROBE3(proc, , , signal__discard, td, p, sig); in tdsendsignal()
2356 if (SIGISMEMBER(td->td_sigmask, sig)) in tdsendsignal()
2406 signotify(td); in tdsendsignal()
2516 thread_lock(td); in tdsendsignal()
2517 if (TD_CAN_ABORT(td)) in tdsendsignal()
2518 sig_sleepq_abort(td, intrval); in tdsendsignal()
2520 thread_unlock(td); in tdsendsignal()
2529 tdsigwakeup(td, sig, action, intrval); in tdsendsignal()
2541 sig_suspend_threads(td, p); in tdsendsignal()
2568 tdsigwakeup(td, sig, action, intrval); in tdsendsignal()
2585 tdsigwakeup(struct thread *td, int sig, sig_t action, int intrval) in tdsigwakeup() argument
2587 struct proc *p = td->td_proc; in tdsigwakeup()
2594 thread_lock(td); in tdsigwakeup()
2602 td->td_priority > PUSER && !TD_IS_IDLETHREAD(td)) in tdsigwakeup()
2603 sched_prio(td, PUSER); in tdsigwakeup()
2604 if (TD_ON_SLEEPQ(td)) { in tdsigwakeup()
2611 if ((td->td_flags & TDF_SINTR) == 0) in tdsigwakeup()
2619 thread_unlock(td); in tdsigwakeup()
2626 sigqueue_delete(&td->td_sigqueue, sig); in tdsigwakeup()
2634 if ((prop & SIGPROP_STOP) != 0 && (td->td_flags & (TDF_SBDRY | in tdsigwakeup()
2641 if (td->td_priority > PUSER && !TD_IS_IDLETHREAD(td)) in tdsigwakeup()
2642 sched_prio(td, PUSER); in tdsigwakeup()
2644 sig_sleepq_abort(td, intrval); in tdsigwakeup()
2655 if (TD_IS_RUNNING(td) && td != curthread) in tdsigwakeup()
2656 forward_signal(td); in tdsigwakeup()
2661 thread_unlock(td); in tdsigwakeup()
2665 ptrace_coredumpreq(struct thread *td, struct proc *p, in ptrace_coredumpreq() argument
2676 tcq->tc_error = p->p_sysent->sv_coredump(td, tcq->tc_vp, in ptrace_coredumpreq()
2682 ptrace_syscallreq(struct thread *td, struct proc *p, in ptrace_syscallreq() argument
2708 td->td_pticks = 0; in ptrace_syscallreq()
2709 if (__predict_false(td->td_cowgen != atomic_load_int( in ptrace_syscallreq()
2710 &td->td_proc->p_cowgen))) in ptrace_syscallreq()
2711 thread_cow_update(td); in ptrace_syscallreq()
2713 td->td_sa = tsr->ts_sa; in ptrace_syscallreq()
2717 if (CAP_TRACING(td)) in ptrace_syscallreq()
2719 if (IN_CAPABILITY_MODE(td)) { in ptrace_syscallreq()
2727 audited = AUDIT_SYSCALL_ENTER(sc, td) != 0; in ptrace_syscallreq()
2730 error = syscall_thread_enter(td, &se); in ptrace_syscallreq()
2738 rv_saved[0] = td->td_retval[0]; in ptrace_syscallreq()
2739 rv_saved[1] = td->td_retval[1]; in ptrace_syscallreq()
2740 nerror = td->td_errno; in ptrace_syscallreq()
2741 td->td_retval[0] = 0; in ptrace_syscallreq()
2742 td->td_retval[1] = 0; in ptrace_syscallreq()
2748 tsr->ts_ret.sr_error = se->sy_call(td, tsr->ts_sa.args); in ptrace_syscallreq()
2752 tsr->ts_ret.sr_error != 0 ? -1 : td->td_retval[0]); in ptrace_syscallreq()
2755 tsr->ts_ret.sr_retval[0] = td->td_retval[0]; in ptrace_syscallreq()
2756 tsr->ts_ret.sr_retval[1] = td->td_retval[1]; in ptrace_syscallreq()
2757 td->td_retval[0] = rv_saved[0]; in ptrace_syscallreq()
2758 td->td_retval[1] = rv_saved[1]; in ptrace_syscallreq()
2759 td->td_errno = nerror; in ptrace_syscallreq()
2762 AUDIT_SYSCALL_EXIT(error, td); in ptrace_syscallreq()
2764 syscall_thread_exit(td, se); in ptrace_syscallreq()
2768 ptrace_remotereq(struct thread *td, int flag) in ptrace_remotereq() argument
2772 MPASS(td == curthread); in ptrace_remotereq()
2773 p = td->td_proc; in ptrace_remotereq()
2775 if ((td->td_dbgflags & flag) == 0) in ptrace_remotereq()
2778 KASSERT(td->td_remotereq != NULL, ("td_remotereq is NULL")); in ptrace_remotereq()
2783 ptrace_coredumpreq(td, p, td->td_remotereq); in ptrace_remotereq()
2786 ptrace_syscallreq(td, p, td->td_remotereq); in ptrace_remotereq()
2793 MPASS((td->td_dbgflags & flag) != 0); in ptrace_remotereq()
2794 td->td_dbgflags &= ~flag; in ptrace_remotereq()
2795 td->td_remotereq = NULL; in ptrace_remotereq()
2808 sig_suspend_threads(struct thread *td, struct proc *p) in sig_suspend_threads() argument
2840 if (TD_IS_RUNNING(td2) && td2 != td) in sig_suspend_threads()
2850 sig_handle_first_stop(struct thread *td, struct proc *p, int sig) in sig_handle_first_stop() argument
2852 if (td != NULL && (td->td_dbgflags & TDB_FSTP) == 0 && in sig_handle_first_stop()
2857 p->p_xthread = td; in sig_handle_first_stop()
2863 if (td != NULL && td->td_wchan == NULL) in sig_handle_first_stop()
2864 td->td_dbgflags &= ~TDB_FSTP; in sig_handle_first_stop()
2868 if (sig_suspend_threads(td, p) && td == NULL) in sig_handle_first_stop()
2880 ptracestop(struct thread *td, int sig, ksiginfo_t *si) in ptracestop() argument
2882 struct proc *p = td->td_proc; in ptracestop()
2891 td->td_xsig = sig; in ptracestop()
2894 td->td_dbgflags |= TDB_XSIG; in ptracestop()
2896 td->td_tid, p->p_pid, td->td_dbgflags, sig); in ptracestop()
2898 while ((p->p_flag & P_TRACED) && (td->td_dbgflags & TDB_XSIG)) { in ptracestop()
2907 td->td_dbgflags &= ~TDB_XSIG; in ptracestop()
2908 td->td_xsig = SIGKILL; in ptracestop()
2913 !(td->td_dbgflags & TDB_EXIT)) { in ptracestop()
2918 td->td_dbgflags &= ~TDB_XSIG; in ptracestop()
2932 sig_handle_first_stop(td, p, sig); in ptracestop()
2934 if ((td->td_dbgflags & TDB_STOPATFORK) != 0) { in ptracestop()
2935 td->td_dbgflags &= ~TDB_STOPATFORK; in ptracestop()
2938 td->td_dbgflags |= TDB_SSWITCH; in ptracestop()
2939 thread_suspend_switch(td, p); in ptracestop()
2940 td->td_dbgflags &= ~TDB_SSWITCH; in ptracestop()
2941 if ((td->td_dbgflags & (TDB_COREDUMPREQ | in ptracestop()
2943 MPASS((td->td_dbgflags & (TDB_COREDUMPREQ | in ptracestop()
2947 ptrace_remotereq(td, td->td_dbgflags & in ptracestop()
2952 if (p->p_xthread == td) in ptracestop()
2956 if (td->td_dbgflags & TDB_SUSPEND) { in ptracestop()
2965 if (si != NULL && sig == td->td_xsig) { in ptracestop()
2968 if (sigqueue_add(&td->td_sigqueue, sig, si) != 0) in ptracestop()
2970 } else if (td->td_xsig != 0) { in ptracestop()
2976 ksi.ksi_signo = td->td_xsig; in ptracestop()
2978 td2 = sigtd(p, td->td_xsig, false); in ptracestop()
2979 tdsendsignal(p, td2, td->td_xsig, &ksi); in ptracestop()
2980 if (td != td2) in ptracestop()
2984 return (td->td_xsig); in ptracestop()
2991 struct thread *td; in reschedule_signals() local
3004 td = sigtd(p, sig, fastblk); in reschedule_signals()
3011 if (fastblk && td == curthread) in reschedule_signals()
3014 signotify(td); in reschedule_signals()
3019 !SIGISMEMBER(td->td_sigmask, sig))) { in reschedule_signals()
3020 tdsigwakeup(td, sig, SIG_CATCH, in reschedule_signals()
3030 tdsigcleanup(struct thread *td) in tdsigcleanup() argument
3035 p = td->td_proc; in tdsigcleanup()
3038 sigqueue_flush(&td->td_sigqueue); in tdsigcleanup()
3051 SIGSETNAND(unblocked, td->td_sigmask); in tdsigcleanup()
3052 SIGFILLSET(td->td_sigmask); in tdsigcleanup()
3078 struct thread *td; in sigdeferstop_impl() local
3081 td = curthread; in sigdeferstop_impl()
3082 cflags = sigdeferstop_curr_flags(td->td_flags); in sigdeferstop_impl()
3105 thread_lock(td); in sigdeferstop_impl()
3106 td->td_flags = (td->td_flags & ~cflags) | nflags; in sigdeferstop_impl()
3107 thread_unlock(td); in sigdeferstop_impl()
3120 struct thread *td; in sigallowstop_impl() local
3126 td = curthread; in sigallowstop_impl()
3127 cflags = sigdeferstop_curr_flags(td->td_flags); in sigallowstop_impl()
3129 thread_lock(td); in sigallowstop_impl()
3130 td->td_flags = (td->td_flags & ~cflags) | prev; in sigallowstop_impl()
3131 thread_unlock(td); in sigallowstop_impl()
3153 sigprocess(struct thread *td, int sig) in sigprocess() argument
3163 p = td->td_proc; in sigprocess()
3175 (td->td_flags & TDF_SIGWAIT) == 0) { in sigprocess()
3196 queue = &td->td_sigqueue; in sigprocess()
3202 td->td_si = ksi.ksi_info; in sigprocess()
3205 sig = ptracestop(td, sig, &ksi); in sigprocess()
3208 td->td_si.si_signo = 0; in sigprocess()
3220 if (SIGISMEMBER(td->td_sigmask, sig)) { in sigprocess()
3279 if (TD_SBDRY_INTR(td)) { in sigprocess()
3280 KASSERT((td->td_flags & TDF_SBDRY) != 0, in sigprocess()
3287 sigqueue_delete(&td->td_sigqueue, sig); in sigprocess()
3292 sig_suspend_threads(td, p); in sigprocess()
3293 thread_suspend_switch(td, p); in sigprocess()
3298 (td->td_flags & TDF_SIGWAIT) == 0) { in sigprocess()
3309 if ((td->td_flags & TDF_SIGWAIT) == 0) in sigprocess()
3335 issignal(struct thread *td) in issignal() argument
3341 p = td->td_proc; in issignal()
3345 sigpending = td->td_sigqueue.sq_signals; in issignal()
3347 SIGSETNAND(sigpending, td->td_sigmask); in issignal()
3349 if ((p->p_flag & P_PPWAIT) != 0 || (td->td_flags & in issignal()
3363 if ((td->td_pflags & TDP_SIGFASTBLOCK) != 0) { in issignal()
3364 if (td->td_sigblock_val != 0) in issignal()
3367 td->td_pflags |= TDP_SIGFASTPENDING; in issignal()
3382 td->td_dbgflags |= TDB_FSTP; in issignal()
3388 switch (sigprocess(td, sig)) { in issignal()
3394 sigqueue_delete(&td->td_sigqueue, sig); in issignal()
3433 struct thread *td; in postsig() local
3442 td = curthread; in postsig()
3443 p = td->td_proc; in postsig()
3448 if (sigqueue_get(&td->td_sigqueue, sig, &ksi) == 0 && in postsig()
3456 if (KTRPOINT(td, KTR_PSIG)) in postsig()
3457 ktrpsig(sig, action, td->td_pflags & TDP_OLDMASK ? in postsig()
3458 &td->td_oldsigmask : &td->td_sigmask, ksi.ksi_code); in postsig()
3467 proc_td_siginfo_capture(td, &ksi.ksi_info); in postsig()
3468 sigexit(td, sig); in postsig()
3475 KASSERT(!SIGISMEMBER(td->td_sigmask, sig), in postsig()
3487 if (td->td_pflags & TDP_OLDMASK) { in postsig()
3488 returnmask = td->td_oldsigmask; in postsig()
3489 td->td_pflags &= ~TDP_OLDMASK; in postsig()
3491 returnmask = td->td_sigmask; in postsig()
3497 postsig_done(sig, td, ps); in postsig()
3503 sig_ast_checksusp(struct thread *td) in sig_ast_checksusp() argument
3508 p = td->td_proc; in sig_ast_checksusp()
3511 if (!td_ast_pending(td, TDA_SUSPEND)) in sig_ast_checksusp()
3520 sig_ast_needsigchk(struct thread *td) in sig_ast_needsigchk() argument
3526 p = td->td_proc; in sig_ast_needsigchk()
3529 if (!td_ast_pending(td, TDA_SIG)) in sig_ast_needsigchk()
3534 sig = cursig(td); in sig_ast_needsigchk()
3537 KASSERT((td->td_flags & TDF_SBDRY) != 0, ("lost TDF_SBDRY")); in sig_ast_needsigchk()
3538 KASSERT(TD_SBDRY_INTR(td), in sig_ast_needsigchk()
3540 KASSERT((td->td_flags & (TDF_SEINTR | TDF_SERESTART)) != in sig_ast_needsigchk()
3543 ret = TD_SBDRY_ERRNO(td); in sig_ast_needsigchk()
3558 if ((td->td_dbgflags & TDB_FSTP) != 0) { in sig_ast_needsigchk()
3561 td->td_dbgflags &= ~TDB_FSTP; in sig_ast_needsigchk()
3570 struct thread *td; in sig_intr() local
3574 td = curthread; in sig_intr()
3575 if (!td_ast_pending(td, TDA_SIG) && !td_ast_pending(td, TDA_SUSPEND)) in sig_intr()
3578 p = td->td_proc; in sig_intr()
3581 ret = sig_ast_checksusp(td); in sig_intr()
3583 ret = sig_ast_needsigchk(td); in sig_intr()
3591 struct thread *td; in curproc_sigkilled() local
3596 td = curthread; in curproc_sigkilled()
3597 if (!td_ast_pending(td, TDA_SIG)) in curproc_sigkilled()
3600 p = td->td_proc; in curproc_sigkilled()
3604 res = SIGISMEMBER(td->td_sigqueue.sq_signals, SIGKILL) || in curproc_sigkilled()
3646 sigexit(struct thread *td, int sig) in sigexit() argument
3648 struct proc *p = td->td_proc; in sigexit()
3681 rv = coredump(td); in sigexit()
3705 td->td_ucred->cr_uid, in sigexit()
3709 exit1(td, 0, sig); in sigexit()
3891 vnode_close_locked(struct thread *td, struct vnode *vp) in vnode_close_locked() argument
3895 vn_close(vp, FWRITE, td->td_ucred, td); in vnode_close_locked()
3906 corefile_open_last(struct thread *td, char *name, int indexpos, in corefile_open_last() argument
3930 error = vn_open_cred(&nd, &flags, cmode, oflags, td->td_ucred, in corefile_open_last()
3942 error = VOP_GETATTR(vp, &vattr, td->td_ucred); in corefile_open_last()
3944 vnode_close_locked(td, vp); in corefile_open_last()
3953 vn_close(oldvp, FWRITE, td->td_ucred, td); in corefile_open_last()
3958 vnode_close_locked(td, vp); in corefile_open_last()
3964 if ((td->td_proc->p_flag & P_SUGID) != 0) { in corefile_open_last()
3966 vn_close(oldvp, FWRITE, td->td_ucred, td); in corefile_open_last()
3971 vn_close(nextvp, FWRITE, td->td_ucred, in corefile_open_last()
3972 td); in corefile_open_last()
3977 vn_close(oldvp, FWRITE, td->td_ucred, td); in corefile_open_last()
3982 vnode_close_locked(td, oldvp); in corefile_open_last()
4003 corefile_open(const char *comm, uid_t uid, pid_t pid, struct thread *td, in corefile_open() argument
4033 getcredhostname(td->td_ucred, hostname, in corefile_open()
4088 error = corefile_open_last(td, name, indexpos, indexlen, ncores, in corefile_open()
4101 if ((td->td_proc->p_flag & P_SUGID) != 0) in corefile_open()
4105 error = vn_open_cred(&nd, &flags, cmode, oflags, td->td_ucred, in corefile_open()
4115 audit_proc_coredump(td, name, error); in corefile_open()
4133 coredump(struct thread *td) in coredump() argument
4135 struct proc *p = td->td_proc; in coredump()
4136 struct ucred *cred = td->td_ucred; in coredump()
4149 MPASS((p->p_flag & P_HADTHREADS) == 0 || p->p_singlethread == td); in coredump()
4165 limit = (off_t)lim_cur(td, RLIMIT_CORE); in coredump()
4176 error = corefile_open(p->p_comm, cred->cr_uid, p->p_pid, td, in coredump()
4216 error = p->p_sysent->sv_coredump(td, vp, limit, 0); in coredump()
4267 error1 = vn_close(vp, FWRITE, cred, td); in coredump()
4271 audit_proc_coredump(td, name, error); in coredump()
4288 nosys(struct thread *td, struct nosys_args *args) in nosys() argument
4290 return (kern_nosys(td, args->dummy)); in nosys()
4294 kern_nosys(struct thread *td, int dummy) in kern_nosys() argument
4298 p = td->td_proc; in kern_nosys()
4302 tdsignal(td, SIGSYS); in kern_nosys()
4307 td->td_sa.code); in kern_nosys()
4312 td->td_sa.code); in kern_nosys()
4460 sigfastblock_failed(struct thread *td, bool sendsig, bool write) in sigfastblock_failed() argument
4468 sigfastblock_clear(td); in sigfastblock_failed()
4475 ksi.ksi_addr = td->td_sigblock_ptr; in sigfastblock_failed()
4476 trapsignal(td, &ksi); in sigfastblock_failed()
4480 sigfastblock_fetch_sig(struct thread *td, bool sendsig, uint32_t *valp) in sigfastblock_fetch_sig() argument
4484 if ((td->td_pflags & TDP_SIGFASTBLOCK) == 0) in sigfastblock_fetch_sig()
4486 if (fueword32((void *)td->td_sigblock_ptr, &res) == -1) { in sigfastblock_fetch_sig()
4487 sigfastblock_failed(td, sendsig, false); in sigfastblock_fetch_sig()
4491 td->td_sigblock_val = res & ~SIGFASTBLOCK_FLAGS; in sigfastblock_fetch_sig()
4496 sigfastblock_resched(struct thread *td, bool resched) in sigfastblock_resched() argument
4501 p = td->td_proc; in sigfastblock_resched()
4503 reschedule_signals(p, td->td_sigmask, 0); in sigfastblock_resched()
4506 ast_sched(td, TDA_SIG); in sigfastblock_resched()
4510 sys_sigfastblock(struct thread *td, struct sigfastblock_args *uap) in sys_sigfastblock() argument
4517 p = td->td_proc; in sys_sigfastblock()
4520 if ((td->td_pflags & TDP_SIGFASTBLOCK) != 0) { in sys_sigfastblock()
4528 td->td_pflags |= TDP_SIGFASTBLOCK; in sys_sigfastblock()
4529 td->td_sigblock_ptr = uap->ptr; in sys_sigfastblock()
4533 if ((td->td_pflags & TDP_SIGFASTBLOCK) == 0) { in sys_sigfastblock()
4539 res = casueword32(td->td_sigblock_ptr, in sys_sigfastblock()
4543 sigfastblock_failed(td, false, true); in sys_sigfastblock()
4553 error = thread_check_susp(td, false); in sys_sigfastblock()
4572 td->td_sigblock_val = 0; in sys_sigfastblock()
4579 sigfastblock_resched(td, error == 0 && p->p_numthreads != 1); in sys_sigfastblock()
4584 if ((td->td_pflags & TDP_SIGFASTBLOCK) == 0) { in sys_sigfastblock()
4588 if (!sigfastblock_fetch_sig(td, false, &oldval)) { in sys_sigfastblock()
4596 sigfastblock_clear(td); in sys_sigfastblock()
4607 sigfastblock_clear(struct thread *td) in sigfastblock_clear() argument
4611 if ((td->td_pflags & TDP_SIGFASTBLOCK) == 0) in sigfastblock_clear()
4613 td->td_sigblock_val = 0; in sigfastblock_clear()
4614 resched = (td->td_pflags & TDP_SIGFASTPENDING) != 0 || in sigfastblock_clear()
4615 SIGPENDING(td); in sigfastblock_clear()
4616 td->td_pflags &= ~(TDP_SIGFASTBLOCK | TDP_SIGFASTPENDING); in sigfastblock_clear()
4617 sigfastblock_resched(td, resched); in sigfastblock_clear()
4621 sigfastblock_fetch(struct thread *td) in sigfastblock_fetch() argument
4625 (void)sigfastblock_fetch_sig(td, true, &val); in sigfastblock_fetch()
4629 sigfastblock_setpend1(struct thread *td) in sigfastblock_setpend1() argument
4634 if ((td->td_pflags & TDP_SIGFASTPENDING) == 0) in sigfastblock_setpend1()
4636 res = fueword32((void *)td->td_sigblock_ptr, &oldval); in sigfastblock_setpend1()
4638 sigfastblock_failed(td, true, false); in sigfastblock_setpend1()
4642 res = casueword32(td->td_sigblock_ptr, oldval, &oldval, in sigfastblock_setpend1()
4645 sigfastblock_failed(td, true, true); in sigfastblock_setpend1()
4649 td->td_sigblock_val = oldval & ~SIGFASTBLOCK_FLAGS; in sigfastblock_setpend1()
4650 td->td_pflags &= ~TDP_SIGFASTPENDING; in sigfastblock_setpend1()
4654 if (thread_check_susp(td, false) != 0) in sigfastblock_setpend1()
4660 sigfastblock_setpend(struct thread *td, bool resched) in sigfastblock_setpend() argument
4664 sigfastblock_setpend1(td); in sigfastblock_setpend()
4666 p = td->td_proc; in sigfastblock_setpend()