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);
281 ast_sig(struct thread *td, int tda) in ast_sig() argument
287 p = td->td_proc; in ast_sig()
293 thread_lock(td); in ast_sig()
302 (td->td_pflags & TDP_SIGFASTBLOCK) == 0) { in ast_sig()
303 if (SIGPENDING(td) && ((tda | td->td_ast) & in ast_sig()
305 thread_unlock(td); /* fix dumps */ in ast_sig()
309 p, td, tda, td->td_ast, td->td_flags); in ast_sig()
312 thread_unlock(td); in ast_sig()
324 sigfastblock_fetch(td); in ast_sig()
326 old_boundary = ~TDB_BOUNDARY | (td->td_dbgflags & TDB_BOUNDARY); in ast_sig()
327 td->td_dbgflags |= TDB_BOUNDARY; in ast_sig()
329 while ((sig = cursig(td)) != 0) { in ast_sig()
334 td->td_dbgflags &= old_boundary; in ast_sig()
345 sigfastblock_setpend(td, resched_sigs); in ast_sig()
349 ast_sigsuspend(struct thread *td, int tda __unused) in ast_sigsuspend() argument
351 MPASS((td->td_pflags & TDP_OLDMASK) != 0); in ast_sigsuspend()
352 td->td_pflags &= ~TDP_OLDMASK; in ast_sigsuspend()
353 kern_sigprocmask(td, SIG_SETMASK, &td->td_oldsigmask, NULL, 0); in ast_sigsuspend()
719 cursig(struct thread *td) in cursig() argument
721 PROC_LOCK_ASSERT(td->td_proc, MA_OWNED); in cursig()
722 mtx_assert(&td->td_proc->p_sigacts->ps_mtx, MA_OWNED); in cursig()
723 THREAD_LOCK_ASSERT(td, MA_NOTOWNED); in cursig()
724 return (SIGPENDING(td) ? issignal(td) : 0); in cursig()
733 signotify(struct thread *td) in signotify() argument
736 PROC_LOCK_ASSERT(td->td_proc, MA_OWNED); in signotify()
738 if (SIGPENDING(td)) in signotify()
739 ast_sched(td, TDA_SIG); in signotify()
750 struct thread *td; in sigonstack() local
752 td = curthread; in sigonstack()
753 if ((td->td_pflags & TDP_ALTSTACK) == 0) in sigonstack()
756 if (SV_PROC_FLAG(td->td_proc, SV_AOUT) && td->td_sigstk.ss_size == 0) in sigonstack()
757 return ((td->td_sigstk.ss_flags & SS_ONSTACK) != 0); in sigonstack()
759 return (sp >= (size_t)td->td_sigstk.ss_sp && in sigonstack()
760 sp < td->td_sigstk.ss_size + (size_t)td->td_sigstk.ss_sp); in sigonstack()
793 kern_sigaction(struct thread *td, int sig, const struct sigaction *act, in kern_sigaction() argument
797 struct proc *p = td->td_proc; in kern_sigaction()
945 sys_sigaction(struct thread *td, struct sigaction_args *uap) in sys_sigaction() argument
958 error = kern_sigaction(td, uap->sig, actp, oactp, 0); in sys_sigaction()
973 freebsd4_sigaction(struct thread *td, struct freebsd4_sigaction_args *uap) in freebsd4_sigaction() argument
986 error = kern_sigaction(td, uap->sig, actp, oactp, KSA_FREEBSD4); in freebsd4_sigaction()
1002 osigaction(struct thread *td, struct osigaction_args *uap) in osigaction() argument
1023 error = kern_sigaction(td, uap->signum, nsap, osap, KSA_OSIGSET); in osigaction()
1036 osigreturn(struct thread *td, struct osigreturn_args *uap) in osigreturn() argument
1039 return (nosys(td, (struct nosys_args *)uap)); in osigreturn()
1088 struct thread *td; in execsigs() local
1104 td = curthread; in execsigs()
1105 MPASS(td->td_proc == p); in execsigs()
1106 td->td_sigstk.ss_flags = SS_DISABLE; in execsigs()
1107 td->td_sigstk.ss_size = 0; in execsigs()
1108 td->td_sigstk.ss_sp = 0; in execsigs()
1109 td->td_pflags &= ~TDP_ALTSTACK; in execsigs()
1125 kern_sigprocmask(struct thread *td, int how, sigset_t *set, sigset_t *oset, in kern_sigprocmask() argument
1132 p = td->td_proc; in kern_sigprocmask()
1140 *oset = td->td_sigmask; in kern_sigprocmask()
1147 oset1 = td->td_sigmask; in kern_sigprocmask()
1148 SIGSETOR(td->td_sigmask, *set); in kern_sigprocmask()
1149 new_block = td->td_sigmask; in kern_sigprocmask()
1153 SIGSETNAND(td->td_sigmask, *set); in kern_sigprocmask()
1154 signotify(td); in kern_sigprocmask()
1158 oset1 = td->td_sigmask; in kern_sigprocmask()
1160 SIGSETLO(td->td_sigmask, *set); in kern_sigprocmask()
1162 td->td_sigmask = *set; in kern_sigprocmask()
1163 new_block = td->td_sigmask; in kern_sigprocmask()
1165 signotify(td); in kern_sigprocmask()
1199 sys_sigprocmask(struct thread *td, struct sigprocmask_args *uap) in sys_sigprocmask() argument
1212 error = kern_sigprocmask(td, uap->how, setp, osetp, 0); in sys_sigprocmask()
1227 osigprocmask(struct thread *td, struct osigprocmask_args *uap) in osigprocmask() argument
1233 error = kern_sigprocmask(td, uap->how, &set, &oset, 1); in osigprocmask()
1234 SIG2OSIG(oset, td->td_retval[0]); in osigprocmask()
1240 sys_sigwait(struct thread *td, struct sigwait_args *uap) in sys_sigwait() argument
1248 td->td_retval[0] = error; in sys_sigwait()
1252 error = kern_sigtimedwait(td, set, &ksi, NULL); in sys_sigwait()
1261 if (error == EINTR && td->td_proc->p_osrel < P_OSREL_SIGWAIT) in sys_sigwait()
1263 td->td_retval[0] = error; in sys_sigwait()
1268 td->td_retval[0] = error; in sys_sigwait()
1273 sys_sigtimedwait(struct thread *td, struct sigtimedwait_args *uap) in sys_sigtimedwait() argument
1294 error = kern_sigtimedwait(td, set, &ksi, timeout); in sys_sigtimedwait()
1302 td->td_retval[0] = ksi.ksi_signo; in sys_sigtimedwait()
1307 sys_sigwaitinfo(struct thread *td, struct sigwaitinfo_args *uap) in sys_sigwaitinfo() argument
1317 error = kern_sigtimedwait(td, set, &ksi, NULL); in sys_sigwaitinfo()
1325 td->td_retval[0] = ksi.ksi_signo; in sys_sigwaitinfo()
1330 proc_td_siginfo_capture(struct thread *td, siginfo_t *si) in proc_td_siginfo_capture() argument
1334 FOREACH_THREAD_IN_PROC(td->td_proc, thr) { in proc_td_siginfo_capture()
1335 if (thr == td) in proc_td_siginfo_capture()
1343 kern_sigtimedwait(struct thread *td, sigset_t waitset, ksiginfo_t *ksi, in kern_sigtimedwait() argument
1354 p = td->td_proc; in kern_sigtimedwait()
1359 sigfastblock_fetch(td); in kern_sigtimedwait()
1382 saved_mask = td->td_sigmask; in kern_sigtimedwait()
1383 SIGSETNAND(td->td_sigmask, waitset); in kern_sigtimedwait()
1386 thread_lock(td); in kern_sigtimedwait()
1387 td->td_flags |= TDF_SIGWAIT; in kern_sigtimedwait()
1388 thread_unlock(td); in kern_sigtimedwait()
1392 sig = cursig(td); in kern_sigtimedwait()
1396 if (sigqueue_get(&td->td_sigqueue, sig, ksi) != 0 || in kern_sigtimedwait()
1437 thread_lock(td); in kern_sigtimedwait()
1438 td->td_flags &= ~TDF_SIGWAIT; in kern_sigtimedwait()
1439 thread_unlock(td); in kern_sigtimedwait()
1442 SIGSETNAND(new_block, td->td_sigmask); in kern_sigtimedwait()
1443 td->td_sigmask = saved_mask; in kern_sigtimedwait()
1458 if (KTRPOINT(td, KTR_PSIG)) { in kern_sigtimedwait()
1464 ktrpsig(sig, action, &td->td_sigmask, ksi->ksi_code); in kern_sigtimedwait()
1468 proc_td_siginfo_capture(td, &ksi->ksi_info); in kern_sigtimedwait()
1469 sigexit(td, sig); in kern_sigtimedwait()
1482 sys_sigpending(struct thread *td, struct sigpending_args *uap) in sys_sigpending() argument
1484 struct proc *p = td->td_proc; in sys_sigpending()
1489 SIGSETOR(pending, td->td_sigqueue.sq_signals); in sys_sigpending()
1501 osigpending(struct thread *td, struct osigpending_args *uap) in osigpending() argument
1503 struct proc *p = td->td_proc; in osigpending()
1508 SIGSETOR(pending, td->td_sigqueue.sq_signals); in osigpending()
1510 SIG2OSIG(pending, td->td_retval[0]); in osigpending()
1528 osigvec(struct thread *td, struct osigvec_args *uap) in osigvec() argument
1548 error = kern_sigaction(td, uap->signum, nsap, osap, KSA_OSIGSET); in osigvec()
1566 osigblock(struct thread *td, struct osigblock_args *uap) in osigblock() argument
1571 kern_sigprocmask(td, SIG_BLOCK, &set, &oset, 0); in osigblock()
1572 SIG2OSIG(oset, td->td_retval[0]); in osigblock()
1582 osigsetmask(struct thread *td, struct osigsetmask_args *uap) in osigsetmask() argument
1587 kern_sigprocmask(td, SIG_SETMASK, &set, &oset, 0); in osigsetmask()
1588 SIG2OSIG(oset, td->td_retval[0]); in osigsetmask()
1604 sys_sigsuspend(struct thread *td, struct sigsuspend_args *uap) in sys_sigsuspend() argument
1612 return (kern_sigsuspend(td, mask)); in sys_sigsuspend()
1616 kern_sigsuspend(struct thread *td, sigset_t mask) in kern_sigsuspend() argument
1618 struct proc *p = td->td_proc; in kern_sigsuspend()
1622 sigfastblock_fetch(td); in kern_sigsuspend()
1632 kern_sigprocmask(td, SIG_SETMASK, &mask, &td->td_oldsigmask, in kern_sigsuspend()
1634 td->td_pflags |= TDP_OLDMASK; in kern_sigsuspend()
1635 ast_sched(td, TDA_SIGSUSPEND); in kern_sigsuspend()
1643 (p->p_sysent->sv_set_syscall_retval)(td, EINTR); in kern_sigsuspend()
1650 while ((sig = cursig(td)) != 0) { in kern_sigsuspend()
1665 td->td_errno = EINTR; in kern_sigsuspend()
1666 td->td_pflags |= TDP_NERRNO; in kern_sigsuspend()
1682 osigsuspend(struct thread *td, struct osigsuspend_args *uap) in osigsuspend() argument
1687 return (kern_sigsuspend(td, mask)); in osigsuspend()
1700 osigstack(struct thread *td, struct osigstack_args *uap) in osigstack() argument
1710 oss.ss_sp = td->td_sigstk.ss_sp; in osigstack()
1711 oss.ss_onstack = sigonstack(cpu_getstack(td)); in osigstack()
1713 td->td_sigstk.ss_sp = nss.ss_sp; in osigstack()
1714 td->td_sigstk.ss_size = 0; in osigstack()
1715 td->td_sigstk.ss_flags |= nss.ss_onstack & SS_ONSTACK; in osigstack()
1716 td->td_pflags |= TDP_ALTSTACK; in osigstack()
1733 sys_sigaltstack(struct thread *td, struct sigaltstack_args *uap) in sys_sigaltstack() argument
1743 error = kern_sigaltstack(td, (uap->ss != NULL) ? &ss : NULL, in sys_sigaltstack()
1753 kern_sigaltstack(struct thread *td, stack_t *ss, stack_t *oss) in kern_sigaltstack() argument
1755 struct proc *p = td->td_proc; in kern_sigaltstack()
1758 oonstack = sigonstack(cpu_getstack(td)); in kern_sigaltstack()
1761 *oss = td->td_sigstk; in kern_sigaltstack()
1762 oss->ss_flags = (td->td_pflags & TDP_ALTSTACK) in kern_sigaltstack()
1775 td->td_sigstk = *ss; in kern_sigaltstack()
1776 td->td_pflags |= TDP_ALTSTACK; in kern_sigaltstack()
1778 td->td_pflags &= ~TDP_ALTSTACK; in kern_sigaltstack()
1785 struct thread *td; member
1798 err = p_cansignal(arg->td, p, arg->sig); in killpg1_sendsig_locked()
1814 (notself && p == arg->td->td_proc) || p->p_state == PRS_NEW) in killpg1_sendsig()
1828 (p == ctx->td->td_proc) || p->p_state == PRS_NEW) in kill_processes_prison_cb()
1839 killpg1(struct thread *td, int sig, int pgid, int all, ksiginfo_t *ksi) in killpg1() argument
1845 arg.td = td; in killpg1()
1855 prison_proc_iterate(td->td_ucred->cr_prison, in killpg1()
1864 pgrp = td->td_proc->p_pgrp; in killpg1()
1900 sys_kill(struct thread *td, struct kill_args *uap) in sys_kill() argument
1903 return (kern_kill(td, uap->pid, uap->signum)); in sys_kill()
1907 kern_kill(struct thread *td, pid_t pid, int signum) in kern_kill() argument
1918 if (pid != td->td_proc->p_pid) { in kern_kill()
1919 if (CAP_TRACING(td)) in kern_kill()
1921 if (IN_CAPABILITY_MODE(td)) in kern_kill()
1933 ksi.ksi_pid = td->td_proc->p_pid; in kern_kill()
1934 ksi.ksi_uid = td->td_ucred->cr_ruid; in kern_kill()
1941 error = p_cansignal(td, p, signum); in kern_kill()
1949 return (killpg1(td, signum, 0, 1, &ksi)); in kern_kill()
1951 return (killpg1(td, signum, 0, 0, &ksi)); in kern_kill()
1953 return (killpg1(td, signum, -pid, 0, &ksi)); in kern_kill()
1959 sys_pdkill(struct thread *td, struct pdkill_args *uap) in sys_pdkill() argument
1969 error = procdesc_find(td, uap->fd, &cap_pdkill_rights, &p); in sys_pdkill()
1973 error = p_cansignal(td, p, uap->signum); in sys_pdkill()
1989 okillpg(struct thread *td, struct okillpg_args *uap) in okillpg() argument
2001 ksi.ksi_pid = td->td_proc->p_pid; in okillpg()
2002 ksi.ksi_uid = td->td_ucred->cr_ruid; in okillpg()
2003 return (killpg1(td, uap->signum, uap->pgid, 0, &ksi)); in okillpg()
2015 sys_sigqueue(struct thread *td, struct sigqueue_args *uap) in sys_sigqueue() argument
2021 return (kern_sigqueue(td, uap->pid, uap->signum, &sv)); in sys_sigqueue()
2025 kern_sigqueue(struct thread *td, pid_t pid, int signumf, union sigval *value) in kern_sigqueue() argument
2049 p = td->td_proc; in kern_sigqueue()
2055 error = p_cansignal(td, p, signum); in kern_sigqueue()
2061 ksi.ksi_pid = td->td_proc->p_pid; in kern_sigqueue()
2062 ksi.ksi_uid = td->td_ucred->cr_ruid; in kern_sigqueue()
2098 postsig_done(int sig, struct thread *td, struct sigacts *ps) in postsig_done() argument
2103 td->td_ru.ru_nsignals++; in postsig_done()
2107 kern_sigprocmask(td, SIG_BLOCK, &mask, NULL, in postsig_done()
2119 trapsignal(struct thread *td, ksiginfo_t *ksi) in trapsignal() argument
2126 p = td->td_proc; in trapsignal()
2130 sigfastblock_fetch(td); in trapsignal()
2134 sigmask = td->td_sigmask; in trapsignal()
2135 if (td->td_sigblock_val != 0) in trapsignal()
2142 &td->td_sigmask, ksi->ksi_code); in trapsignal()
2145 ksi, &td->td_sigmask); in trapsignal()
2146 postsig_done(sig, td, ps); in trapsignal()
2156 SIGDELSET(td->td_sigmask, sig); in trapsignal()
2160 td->td_pflags &= ~TDP_SIGFASTBLOCK; in trapsignal()
2161 td->td_sigblock_val = 0; in trapsignal()
2165 tdsendsignal(p, td, sig, ksi); in trapsignal()
2173 struct thread *td, *signal_td; in sigtd() local
2188 FOREACH_THREAD_IN_PROC(p, td) { in sigtd()
2189 if (!SIGISMEMBER(td->td_sigmask, sig) && (!fast_sigblock || in sigtd()
2190 td != curthread || td->td_sigblock_val == 0) && in sigtd()
2191 (td->td_flags & TDF_BOUNDARY) == 0) { in sigtd()
2192 signal_td = td; in sigtd()
2241 struct thread *td; in sigev_findtd() local
2244 td = tdfind(sigev->sigev_notify_thread_id, p->p_pid); in sigev_findtd()
2245 if (td == NULL) in sigev_findtd()
2247 *ttd = td; in sigev_findtd()
2256 tdsignal(struct thread *td, int sig) in tdsignal() argument
2263 (void) tdsendsignal(td->td_proc, td, sig, &ksi); in tdsignal()
2267 tdksignal(struct thread *td, int sig, ksiginfo_t *ksi) in tdksignal() argument
2270 (void) tdsendsignal(td->td_proc, td, sig, ksi); in tdksignal()
2274 sig_sleepq_abort(struct thread *td, int intrval) in sig_sleepq_abort() argument
2276 THREAD_LOCK_ASSERT(td, MA_OWNED); in sig_sleepq_abort()
2278 if (intrval == 0 && (td->td_flags & TDF_SIGWAIT) == 0) in sig_sleepq_abort()
2279 thread_unlock(td); in sig_sleepq_abort()
2281 sleepq_abort(td, intrval); in sig_sleepq_abort()
2285 tdsendsignal(struct proc *p, struct thread *td, int sig, ksiginfo_t *ksi) in tdsendsignal() argument
2292 MPASS(td == NULL || p == td->td_proc); in tdsendsignal()
2313 if (td == NULL) { in tdsendsignal()
2314 td = sigtd(p, sig, false); in tdsendsignal()
2317 sigqueue = &td->td_sigqueue; in tdsendsignal()
2319 SDT_PROBE3(proc, , , signal__send, td, p, sig); in tdsendsignal()
2331 SDT_PROBE3(proc, , , signal__discard, td, p, sig); in tdsendsignal()
2342 if (SIGISMEMBER(td->td_sigmask, sig)) in tdsendsignal()
2383 signotify(td); in tdsendsignal()
2495 thread_lock(td); in tdsendsignal()
2496 if (TD_CAN_ABORT(td)) in tdsendsignal()
2497 sig_sleepq_abort(td, intrval); in tdsendsignal()
2499 thread_unlock(td); in tdsendsignal()
2508 tdsigwakeup(td, sig, action, intrval); in tdsendsignal()
2520 sig_suspend_threads(td, p); in tdsendsignal()
2547 tdsigwakeup(td, sig, action, intrval); in tdsendsignal()
2564 tdsigwakeup(struct thread *td, int sig, sig_t action, int intrval) in tdsigwakeup() argument
2566 struct proc *p = td->td_proc; in tdsigwakeup()
2573 thread_lock(td); in tdsigwakeup()
2581 td->td_priority > PUSER && !TD_IS_IDLETHREAD(td)) in tdsigwakeup()
2582 sched_prio(td, PUSER); in tdsigwakeup()
2583 if (TD_ON_SLEEPQ(td)) { in tdsigwakeup()
2590 if ((td->td_flags & TDF_SINTR) == 0) in tdsigwakeup()
2598 thread_unlock(td); in tdsigwakeup()
2605 sigqueue_delete(&td->td_sigqueue, sig); in tdsigwakeup()
2613 if ((prop & SIGPROP_STOP) != 0 && (td->td_flags & (TDF_SBDRY | in tdsigwakeup()
2620 if (td->td_priority > PUSER && !TD_IS_IDLETHREAD(td)) in tdsigwakeup()
2621 sched_prio(td, PUSER); in tdsigwakeup()
2623 sig_sleepq_abort(td, intrval); in tdsigwakeup()
2634 if (TD_IS_RUNNING(td) && td != curthread) in tdsigwakeup()
2635 forward_signal(td); in tdsigwakeup()
2640 thread_unlock(td); in tdsigwakeup()
2644 ptrace_coredumpreq(struct thread *td, struct proc *p, in ptrace_coredumpreq() argument
2655 tcq->tc_error = p->p_sysent->sv_coredump(td, tcq->tc_vp, in ptrace_coredumpreq()
2661 ptrace_syscallreq(struct thread *td, struct proc *p, in ptrace_syscallreq() argument
2687 td->td_pticks = 0; in ptrace_syscallreq()
2688 if (__predict_false(td->td_cowgen != atomic_load_int( in ptrace_syscallreq()
2689 &td->td_proc->p_cowgen))) in ptrace_syscallreq()
2690 thread_cow_update(td); in ptrace_syscallreq()
2692 td->td_sa = tsr->ts_sa; in ptrace_syscallreq()
2696 if (CAP_TRACING(td)) in ptrace_syscallreq()
2698 if (IN_CAPABILITY_MODE(td)) { in ptrace_syscallreq()
2706 audited = AUDIT_SYSCALL_ENTER(sc, td) != 0; in ptrace_syscallreq()
2709 error = syscall_thread_enter(td, &se); in ptrace_syscallreq()
2717 rv_saved[0] = td->td_retval[0]; in ptrace_syscallreq()
2718 rv_saved[1] = td->td_retval[1]; in ptrace_syscallreq()
2719 nerror = td->td_errno; in ptrace_syscallreq()
2720 td->td_retval[0] = 0; in ptrace_syscallreq()
2721 td->td_retval[1] = 0; in ptrace_syscallreq()
2727 tsr->ts_ret.sr_error = se->sy_call(td, tsr->ts_sa.args); in ptrace_syscallreq()
2731 tsr->ts_ret.sr_error != 0 ? -1 : td->td_retval[0]); in ptrace_syscallreq()
2734 tsr->ts_ret.sr_retval[0] = td->td_retval[0]; in ptrace_syscallreq()
2735 tsr->ts_ret.sr_retval[1] = td->td_retval[1]; in ptrace_syscallreq()
2736 td->td_retval[0] = rv_saved[0]; in ptrace_syscallreq()
2737 td->td_retval[1] = rv_saved[1]; in ptrace_syscallreq()
2738 td->td_errno = nerror; in ptrace_syscallreq()
2741 AUDIT_SYSCALL_EXIT(error, td); in ptrace_syscallreq()
2743 syscall_thread_exit(td, se); in ptrace_syscallreq()
2747 ptrace_remotereq(struct thread *td, int flag) in ptrace_remotereq() argument
2751 MPASS(td == curthread); in ptrace_remotereq()
2752 p = td->td_proc; in ptrace_remotereq()
2754 if ((td->td_dbgflags & flag) == 0) in ptrace_remotereq()
2757 KASSERT(td->td_remotereq != NULL, ("td_remotereq is NULL")); in ptrace_remotereq()
2762 ptrace_coredumpreq(td, p, td->td_remotereq); in ptrace_remotereq()
2765 ptrace_syscallreq(td, p, td->td_remotereq); in ptrace_remotereq()
2772 MPASS((td->td_dbgflags & flag) != 0); in ptrace_remotereq()
2773 td->td_dbgflags &= ~flag; in ptrace_remotereq()
2774 td->td_remotereq = NULL; in ptrace_remotereq()
2779 sig_suspend_threads(struct thread *td, struct proc *p) in sig_suspend_threads() argument
2807 if (TD_IS_RUNNING(td2) && td2 != td) in sig_suspend_threads()
2823 ptracestop(struct thread *td, int sig, ksiginfo_t *si) in ptracestop() argument
2825 struct proc *p = td->td_proc; in ptracestop()
2834 td->td_xsig = sig; in ptracestop()
2837 td->td_dbgflags |= TDB_XSIG; in ptracestop()
2839 td->td_tid, p->p_pid, td->td_dbgflags, sig); in ptracestop()
2841 while ((p->p_flag & P_TRACED) && (td->td_dbgflags & TDB_XSIG)) { in ptracestop()
2850 td->td_dbgflags &= ~TDB_XSIG; in ptracestop()
2851 td->td_xsig = SIGKILL; in ptracestop()
2856 !(td->td_dbgflags & TDB_EXIT)) { in ptracestop()
2861 td->td_dbgflags &= ~TDB_XSIG; in ptracestop()
2875 if ((td->td_dbgflags & TDB_FSTP) != 0 || in ptracestop()
2879 p->p_xthread = td; in ptracestop()
2886 if (td->td_wchan == NULL) in ptracestop()
2887 td->td_dbgflags &= ~TDB_FSTP; in ptracestop()
2891 sig_suspend_threads(td, p); in ptracestop()
2893 if ((td->td_dbgflags & TDB_STOPATFORK) != 0) { in ptracestop()
2894 td->td_dbgflags &= ~TDB_STOPATFORK; in ptracestop()
2897 td->td_dbgflags |= TDB_SSWITCH; in ptracestop()
2898 thread_suspend_switch(td, p); in ptracestop()
2899 td->td_dbgflags &= ~TDB_SSWITCH; in ptracestop()
2900 if ((td->td_dbgflags & (TDB_COREDUMPREQ | in ptracestop()
2902 MPASS((td->td_dbgflags & (TDB_COREDUMPREQ | in ptracestop()
2906 ptrace_remotereq(td, td->td_dbgflags & in ptracestop()
2911 if (p->p_xthread == td) in ptracestop()
2915 if (td->td_dbgflags & TDB_SUSPEND) { in ptracestop()
2924 if (si != NULL && sig == td->td_xsig) { in ptracestop()
2927 if (sigqueue_add(&td->td_sigqueue, sig, si) != 0) in ptracestop()
2929 } else if (td->td_xsig != 0) { in ptracestop()
2935 ksi.ksi_signo = td->td_xsig; in ptracestop()
2937 td2 = sigtd(p, td->td_xsig, false); in ptracestop()
2938 tdsendsignal(p, td2, td->td_xsig, &ksi); in ptracestop()
2939 if (td != td2) in ptracestop()
2943 return (td->td_xsig); in ptracestop()
2950 struct thread *td; in reschedule_signals() local
2963 td = sigtd(p, sig, fastblk); in reschedule_signals()
2970 if (fastblk && td == curthread) in reschedule_signals()
2973 signotify(td); in reschedule_signals()
2978 !SIGISMEMBER(td->td_sigmask, sig))) { in reschedule_signals()
2979 tdsigwakeup(td, sig, SIG_CATCH, in reschedule_signals()
2989 tdsigcleanup(struct thread *td) in tdsigcleanup() argument
2994 p = td->td_proc; in tdsigcleanup()
2997 sigqueue_flush(&td->td_sigqueue); in tdsigcleanup()
3010 SIGSETNAND(unblocked, td->td_sigmask); in tdsigcleanup()
3011 SIGFILLSET(td->td_sigmask); in tdsigcleanup()
3037 struct thread *td; in sigdeferstop_impl() local
3040 td = curthread; in sigdeferstop_impl()
3041 cflags = sigdeferstop_curr_flags(td->td_flags); in sigdeferstop_impl()
3064 thread_lock(td); in sigdeferstop_impl()
3065 td->td_flags = (td->td_flags & ~cflags) | nflags; in sigdeferstop_impl()
3066 thread_unlock(td); in sigdeferstop_impl()
3079 struct thread *td; in sigallowstop_impl() local
3085 td = curthread; in sigallowstop_impl()
3086 cflags = sigdeferstop_curr_flags(td->td_flags); in sigallowstop_impl()
3088 thread_lock(td); in sigallowstop_impl()
3089 td->td_flags = (td->td_flags & ~cflags) | prev; in sigallowstop_impl()
3090 thread_unlock(td); in sigallowstop_impl()
3112 sigprocess(struct thread *td, int sig) in sigprocess() argument
3122 p = td->td_proc; in sigprocess()
3134 (td->td_flags & TDF_SIGWAIT) == 0) { in sigprocess()
3155 queue = &td->td_sigqueue; in sigprocess()
3161 td->td_si = ksi.ksi_info; in sigprocess()
3164 sig = ptracestop(td, sig, &ksi); in sigprocess()
3167 td->td_si.si_signo = 0; in sigprocess()
3179 if (SIGISMEMBER(td->td_sigmask, sig)) { in sigprocess()
3238 if (TD_SBDRY_INTR(td)) { in sigprocess()
3239 KASSERT((td->td_flags & TDF_SBDRY) != 0, in sigprocess()
3246 sigqueue_delete(&td->td_sigqueue, sig); in sigprocess()
3251 sig_suspend_threads(td, p); in sigprocess()
3252 thread_suspend_switch(td, p); in sigprocess()
3257 (td->td_flags & TDF_SIGWAIT) == 0) { in sigprocess()
3268 if ((td->td_flags & TDF_SIGWAIT) == 0) in sigprocess()
3294 issignal(struct thread *td) in issignal() argument
3300 p = td->td_proc; in issignal()
3304 sigpending = td->td_sigqueue.sq_signals; in issignal()
3306 SIGSETNAND(sigpending, td->td_sigmask); in issignal()
3308 if ((p->p_flag & P_PPWAIT) != 0 || (td->td_flags & in issignal()
3322 if ((td->td_pflags & TDP_SIGFASTBLOCK) != 0) { in issignal()
3323 if (td->td_sigblock_val != 0) in issignal()
3326 td->td_pflags |= TDP_SIGFASTPENDING; in issignal()
3340 td->td_dbgflags |= TDB_FSTP; in issignal()
3346 switch (sigprocess(td, sig)) { in issignal()
3352 sigqueue_delete(&td->td_sigqueue, sig); in issignal()
3391 struct thread *td; in postsig() local
3400 td = curthread; in postsig()
3401 p = td->td_proc; in postsig()
3406 if (sigqueue_get(&td->td_sigqueue, sig, &ksi) == 0 && in postsig()
3414 if (KTRPOINT(td, KTR_PSIG)) in postsig()
3415 ktrpsig(sig, action, td->td_pflags & TDP_OLDMASK ? in postsig()
3416 &td->td_oldsigmask : &td->td_sigmask, ksi.ksi_code); in postsig()
3425 proc_td_siginfo_capture(td, &ksi.ksi_info); in postsig()
3426 sigexit(td, sig); in postsig()
3433 KASSERT(!SIGISMEMBER(td->td_sigmask, sig), in postsig()
3445 if (td->td_pflags & TDP_OLDMASK) { in postsig()
3446 returnmask = td->td_oldsigmask; in postsig()
3447 td->td_pflags &= ~TDP_OLDMASK; in postsig()
3449 returnmask = td->td_sigmask; in postsig()
3455 postsig_done(sig, td, ps); in postsig()
3461 sig_ast_checksusp(struct thread *td) in sig_ast_checksusp() argument
3466 p = td->td_proc; in sig_ast_checksusp()
3469 if (!td_ast_pending(td, TDA_SUSPEND)) in sig_ast_checksusp()
3478 sig_ast_needsigchk(struct thread *td) in sig_ast_needsigchk() argument
3484 p = td->td_proc; in sig_ast_needsigchk()
3487 if (!td_ast_pending(td, TDA_SIG)) in sig_ast_needsigchk()
3492 sig = cursig(td); in sig_ast_needsigchk()
3495 KASSERT((td->td_flags & TDF_SBDRY) != 0, ("lost TDF_SBDRY")); in sig_ast_needsigchk()
3496 KASSERT(TD_SBDRY_INTR(td), in sig_ast_needsigchk()
3498 KASSERT((td->td_flags & (TDF_SEINTR | TDF_SERESTART)) != in sig_ast_needsigchk()
3501 ret = TD_SBDRY_ERRNO(td); in sig_ast_needsigchk()
3516 if ((td->td_dbgflags & TDB_FSTP) != 0) { in sig_ast_needsigchk()
3519 td->td_dbgflags &= ~TDB_FSTP; in sig_ast_needsigchk()
3528 struct thread *td; in sig_intr() local
3532 td = curthread; in sig_intr()
3533 if (!td_ast_pending(td, TDA_SIG) && !td_ast_pending(td, TDA_SUSPEND)) in sig_intr()
3536 p = td->td_proc; in sig_intr()
3539 ret = sig_ast_checksusp(td); in sig_intr()
3541 ret = sig_ast_needsigchk(td); in sig_intr()
3549 struct thread *td; in curproc_sigkilled() local
3554 td = curthread; in curproc_sigkilled()
3555 if (!td_ast_pending(td, TDA_SIG)) in curproc_sigkilled()
3558 p = td->td_proc; in curproc_sigkilled()
3562 res = SIGISMEMBER(td->td_sigqueue.sq_signals, SIGKILL) || in curproc_sigkilled()
3604 sigexit(struct thread *td, int sig) in sigexit() argument
3606 struct proc *p = td->td_proc; in sigexit()
3639 rv = coredump(td); in sigexit()
3663 td->td_ucred->cr_uid, in sigexit()
3667 exit1(td, 0, sig); in sigexit()
3839 vnode_close_locked(struct thread *td, struct vnode *vp) in vnode_close_locked() argument
3843 vn_close(vp, FWRITE, td->td_ucred, td); in vnode_close_locked()
3854 corefile_open_last(struct thread *td, char *name, int indexpos, in corefile_open_last() argument
3878 error = vn_open_cred(&nd, &flags, cmode, oflags, td->td_ucred, in corefile_open_last()
3890 error = VOP_GETATTR(vp, &vattr, td->td_ucred); in corefile_open_last()
3892 vnode_close_locked(td, vp); in corefile_open_last()
3901 vn_close(oldvp, FWRITE, td->td_ucred, td); in corefile_open_last()
3906 vnode_close_locked(td, vp); in corefile_open_last()
3912 if ((td->td_proc->p_flag & P_SUGID) != 0) { in corefile_open_last()
3914 vn_close(oldvp, FWRITE, td->td_ucred, td); in corefile_open_last()
3919 vn_close(nextvp, FWRITE, td->td_ucred, in corefile_open_last()
3920 td); in corefile_open_last()
3925 vn_close(oldvp, FWRITE, td->td_ucred, td); in corefile_open_last()
3930 vnode_close_locked(td, oldvp); in corefile_open_last()
3951 corefile_open(const char *comm, uid_t uid, pid_t pid, struct thread *td, in corefile_open() argument
3981 getcredhostname(td->td_ucred, hostname, in corefile_open()
4036 error = corefile_open_last(td, name, indexpos, indexlen, ncores, in corefile_open()
4049 if ((td->td_proc->p_flag & P_SUGID) != 0) in corefile_open()
4053 error = vn_open_cred(&nd, &flags, cmode, oflags, td->td_ucred, in corefile_open()
4063 audit_proc_coredump(td, name, error); in corefile_open()
4081 coredump(struct thread *td) in coredump() argument
4083 struct proc *p = td->td_proc; in coredump()
4084 struct ucred *cred = td->td_ucred; in coredump()
4097 MPASS((p->p_flag & P_HADTHREADS) == 0 || p->p_singlethread == td); in coredump()
4113 limit = (off_t)lim_cur(td, RLIMIT_CORE); in coredump()
4120 error = corefile_open(p->p_comm, cred->cr_uid, p->p_pid, td, in coredump()
4160 error = p->p_sysent->sv_coredump(td, vp, limit, 0); in coredump()
4208 error1 = vn_close(vp, FWRITE, cred, td); in coredump()
4212 audit_proc_coredump(td, name, error); in coredump()
4229 nosys(struct thread *td, struct nosys_args *args) in nosys() argument
4233 p = td->td_proc; in nosys()
4237 tdsignal(td, SIGSYS); in nosys()
4242 td->td_sa.code); in nosys()
4247 td->td_sa.code); in nosys()
4395 sigfastblock_failed(struct thread *td, bool sendsig, bool write) in sigfastblock_failed() argument
4403 sigfastblock_clear(td); in sigfastblock_failed()
4410 ksi.ksi_addr = td->td_sigblock_ptr; in sigfastblock_failed()
4411 trapsignal(td, &ksi); in sigfastblock_failed()
4415 sigfastblock_fetch_sig(struct thread *td, bool sendsig, uint32_t *valp) in sigfastblock_fetch_sig() argument
4419 if ((td->td_pflags & TDP_SIGFASTBLOCK) == 0) in sigfastblock_fetch_sig()
4421 if (fueword32((void *)td->td_sigblock_ptr, &res) == -1) { in sigfastblock_fetch_sig()
4422 sigfastblock_failed(td, sendsig, false); in sigfastblock_fetch_sig()
4426 td->td_sigblock_val = res & ~SIGFASTBLOCK_FLAGS; in sigfastblock_fetch_sig()
4431 sigfastblock_resched(struct thread *td, bool resched) in sigfastblock_resched() argument
4436 p = td->td_proc; in sigfastblock_resched()
4438 reschedule_signals(p, td->td_sigmask, 0); in sigfastblock_resched()
4441 ast_sched(td, TDA_SIG); in sigfastblock_resched()
4445 sys_sigfastblock(struct thread *td, struct sigfastblock_args *uap) in sys_sigfastblock() argument
4452 p = td->td_proc; in sys_sigfastblock()
4455 if ((td->td_pflags & TDP_SIGFASTBLOCK) != 0) { in sys_sigfastblock()
4463 td->td_pflags |= TDP_SIGFASTBLOCK; in sys_sigfastblock()
4464 td->td_sigblock_ptr = uap->ptr; in sys_sigfastblock()
4468 if ((td->td_pflags & TDP_SIGFASTBLOCK) == 0) { in sys_sigfastblock()
4474 res = casueword32(td->td_sigblock_ptr, in sys_sigfastblock()
4478 sigfastblock_failed(td, false, true); in sys_sigfastblock()
4488 error = thread_check_susp(td, false); in sys_sigfastblock()
4507 td->td_sigblock_val = 0; in sys_sigfastblock()
4514 sigfastblock_resched(td, error == 0 && p->p_numthreads != 1); in sys_sigfastblock()
4519 if ((td->td_pflags & TDP_SIGFASTBLOCK) == 0) { in sys_sigfastblock()
4523 if (!sigfastblock_fetch_sig(td, false, &oldval)) { in sys_sigfastblock()
4531 sigfastblock_clear(td); in sys_sigfastblock()
4542 sigfastblock_clear(struct thread *td) in sigfastblock_clear() argument
4546 if ((td->td_pflags & TDP_SIGFASTBLOCK) == 0) in sigfastblock_clear()
4548 td->td_sigblock_val = 0; in sigfastblock_clear()
4549 resched = (td->td_pflags & TDP_SIGFASTPENDING) != 0 || in sigfastblock_clear()
4550 SIGPENDING(td); in sigfastblock_clear()
4551 td->td_pflags &= ~(TDP_SIGFASTBLOCK | TDP_SIGFASTPENDING); in sigfastblock_clear()
4552 sigfastblock_resched(td, resched); in sigfastblock_clear()
4556 sigfastblock_fetch(struct thread *td) in sigfastblock_fetch() argument
4560 (void)sigfastblock_fetch_sig(td, true, &val); in sigfastblock_fetch()
4564 sigfastblock_setpend1(struct thread *td) in sigfastblock_setpend1() argument
4569 if ((td->td_pflags & TDP_SIGFASTPENDING) == 0) in sigfastblock_setpend1()
4571 res = fueword32((void *)td->td_sigblock_ptr, &oldval); in sigfastblock_setpend1()
4573 sigfastblock_failed(td, true, false); in sigfastblock_setpend1()
4577 res = casueword32(td->td_sigblock_ptr, oldval, &oldval, in sigfastblock_setpend1()
4580 sigfastblock_failed(td, true, true); in sigfastblock_setpend1()
4584 td->td_sigblock_val = oldval & ~SIGFASTBLOCK_FLAGS; in sigfastblock_setpend1()
4585 td->td_pflags &= ~TDP_SIGFASTPENDING; in sigfastblock_setpend1()
4589 if (thread_check_susp(td, false) != 0) in sigfastblock_setpend1()
4595 sigfastblock_setpend(struct thread *td, bool resched) in sigfastblock_setpend() argument
4599 sigfastblock_setpend1(td); in sigfastblock_setpend()
4601 p = td->td_proc; in sigfastblock_setpend()