Lines Matching +full:sr +full:- +full:iov

1 /*-
2 * SPDX-License-Identifier: BSD-4-Clause
72 #define PROC_ASSERT_TRACEREQ(p) MPASS(((p)->p_flag2 & P2_PTRACEREQ) != 0)
78 * Get the current user-visible register set from the process
86 * Depending on the architecture this may have fix-up work to do,
103 PROC_LOCK_ASSERT(td->td_proc, MA_OWNED); in proc_read_regs()
110 PROC_LOCK_ASSERT(td->td_proc, MA_OWNED); in proc_write_regs()
117 PROC_LOCK_ASSERT(td->td_proc, MA_OWNED); in proc_read_dbregs()
124 PROC_LOCK_ASSERT(td->td_proc, MA_OWNED); in proc_write_dbregs()
135 PROC_LOCK_ASSERT(td->td_proc, MA_OWNED); in proc_read_fpregs()
142 PROC_LOCK_ASSERT(td->td_proc, MA_OWNED); in proc_write_fpregs()
152 sv = td->td_proc->p_sysent; in proc_find_regset()
153 regsetp = sv->sv_regset_begin; in proc_find_regset()
156 regset_end = sv->sv_regset_end; in proc_find_regset()
160 if (regset->note != note) in proc_find_regset()
170 proc_read_regset(struct thread *td, int note, struct iovec *iov) in proc_read_regset() argument
182 if (regset->get == NULL) in proc_read_regset()
185 size = regset->size; in proc_read_regset()
188 * depending on the hardware, or may have a per-thread size. in proc_read_regset()
191 if (!regset->get(regset, td, NULL, &size)) in proc_read_regset()
195 if (iov->iov_base == NULL) { in proc_read_regset()
196 iov->iov_len = size; in proc_read_regset()
197 if (iov->iov_len == 0) in proc_read_regset()
204 if (iov->iov_len != size) in proc_read_regset()
208 p = td->td_proc; in proc_read_regset()
216 if (!regset->get(regset, td, buf, &size)) { in proc_read_regset()
219 KASSERT(size == regset->size || regset->size == 0, in proc_read_regset()
222 iov->iov_len = size; in proc_read_regset()
224 error = copyout(buf, iov->iov_base, size); in proc_read_regset()
234 proc_write_regset(struct thread *td, int note, struct iovec *iov) in proc_write_regset() argument
246 size = regset->size; in proc_write_regset()
249 * depending on the hardware, or may have a per-thread size. in proc_write_regset()
252 if (!regset->get(regset, td, NULL, &size)) in proc_write_regset()
257 if (iov->iov_len != size) in proc_write_regset()
260 if (regset->set == NULL) in proc_write_regset()
263 p = td->td_proc; in proc_write_regset()
269 error = copyin(iov->iov_base, buf, size); in proc_write_regset()
273 if (!regset->set(regset, td, buf, size)) { in proc_write_regset()
288 PROC_LOCK_ASSERT(td->td_proc, MA_OWNED); in proc_read_regs32()
295 PROC_LOCK_ASSERT(td->td_proc, MA_OWNED); in proc_write_regs32()
302 PROC_LOCK_ASSERT(td->td_proc, MA_OWNED); in proc_read_dbregs32()
309 PROC_LOCK_ASSERT(td->td_proc, MA_OWNED); in proc_write_dbregs32()
316 PROC_LOCK_ASSERT(td->td_proc, MA_OWNED); in proc_read_fpregs32()
323 PROC_LOCK_ASSERT(td->td_proc, MA_OWNED); in proc_write_fpregs32()
331 PROC_LOCK_ASSERT(td->td_proc, MA_OWNED); in proc_sstep()
353 map = &p->p_vmspace->vm_map; in proc_rwmem()
360 writing = uio->uio_rw == UIO_WRITE; in proc_rwmem()
365 error = priv_check_cred(p->p_ucred, PRIV_PROC_MEM_WRITE); in proc_rwmem()
372 * makes things easier. This way is trivial - right? in proc_rwmem()
379 uva = (vm_offset_t)uio->uio_offset; in proc_rwmem()
385 page_offset = uva - pageno; in proc_rwmem()
390 len = min(PAGE_SIZE - page_offset, uio->uio_resid); in proc_rwmem()
409 /* Make the I-cache coherent for breakpoints. */ in proc_rwmem()
423 } while (error == 0 && uio->uio_resid > 0); in proc_rwmem()
432 struct iovec iov; in proc_iop() local
439 iov.iov_base = (caddr_t)buf; in proc_iop()
440 iov.iov_len = len; in proc_iop()
441 uio.uio_iov = &iov; in proc_iop()
450 return (-1); in proc_iop()
451 return (slen - uio.uio_resid); in proc_iop()
487 map = &vm->vm_map; in ptrace_vm_entry()
491 KASSERT((map->header.eflags & MAP_ENTRY_IS_SUB_MAP) == 0, in ptrace_vm_entry()
495 if (index >= pve->pve_entry && in ptrace_vm_entry()
496 (entry->eflags & MAP_ENTRY_IS_SUB_MAP) == 0) in ptrace_vm_entry()
500 if (index < pve->pve_entry) { in ptrace_vm_entry()
504 if (entry == &map->header) { in ptrace_vm_entry()
510 pve->pve_entry = index + 1; in ptrace_vm_entry()
511 pve->pve_timestamp = map->timestamp; in ptrace_vm_entry()
512 pve->pve_start = entry->start; in ptrace_vm_entry()
513 pve->pve_end = entry->end - 1; in ptrace_vm_entry()
514 pve->pve_offset = entry->offset; in ptrace_vm_entry()
515 pve->pve_prot = entry->protection | in ptrace_vm_entry()
516 PROT_MAX(entry->max_protection); in ptrace_vm_entry()
519 if (pve->pve_pathlen == 0) in ptrace_vm_entry()
522 pathlen = pve->pve_pathlen; in ptrace_vm_entry()
523 pve->pve_pathlen = 0; in ptrace_vm_entry()
525 obj = entry->object.vm_object; in ptrace_vm_entry()
532 pve->pve_fsid = VNOVAL; in ptrace_vm_entry()
533 pve->pve_fileid = VNOVAL; in ptrace_vm_entry()
537 for (tobj = obj; tobj != NULL; tobj = tobj->backing_object) { in ptrace_vm_entry()
543 pve->pve_offset += tobj->backing_object_offset; in ptrace_vm_entry()
557 if (VOP_GETATTR(vp, &vattr, td->td_ucred) == 0) { in ptrace_vm_entry()
558 pve->pve_fileid = vattr.va_fileid; in ptrace_vm_entry()
559 pve->pve_fsid = vattr.va_fsid; in ptrace_vm_entry()
564 pve->pve_pathlen = strlen(fullpath) + 1; in ptrace_vm_entry()
565 if (pve->pve_pathlen <= pathlen) { in ptrace_vm_entry()
566 error = copyout(fullpath, pve->pve_path, in ptrace_vm_entry()
567 pve->pve_pathlen); in ptrace_vm_entry()
578 p->p_pid, pve->pve_entry, pve->pve_start); in ptrace_vm_entry()
607 struct ptrace_sc_remote sr; in sys_ptrace() member
612 syscallarg_t args[nitems(td->td_sa.args)]; in sys_ptrace()
616 syscallarg_t pscr_args[nitems(td->td_sa.args)]; in sys_ptrace()
624 AUDIT_ARG_PID(uap->pid); in sys_ptrace()
625 AUDIT_ARG_CMD(uap->req); in sys_ptrace()
626 AUDIT_ARG_VALUE(uap->data); in sys_ptrace()
628 switch (uap->req) { in sys_ptrace()
645 error = copyin(uap->addr, &r.vec, sizeof(r.vec)); in sys_ptrace()
648 error = copyin(uap->addr, &r.reg, sizeof(r.reg)); in sys_ptrace()
651 error = copyin(uap->addr, &r.fpreg, sizeof(r.fpreg)); in sys_ptrace()
654 error = copyin(uap->addr, &r.dbreg, sizeof(r.dbreg)); in sys_ptrace()
657 if (uap->data != sizeof(r.ptevents)) in sys_ptrace()
660 error = copyin(uap->addr, &r.ptevents, uap->data); in sys_ptrace()
663 error = copyin(uap->addr, &r.piod, sizeof(r.piod)); in sys_ptrace()
666 error = copyin(uap->addr, &r.pve, sizeof(r.pve)); in sys_ptrace()
669 if (uap->data != sizeof(r.pc)) in sys_ptrace()
672 error = copyin(uap->addr, &r.pc, uap->data); in sys_ptrace()
675 if (uap->data != sizeof(r.sr)) { in sys_ptrace()
679 error = copyin(uap->addr, &r.sr, uap->data); in sys_ptrace()
682 if (r.sr.pscr_nargs > nitems(td->td_sa.args)) { in sys_ptrace()
686 error = copyin(r.sr.pscr_args, pscr_args, in sys_ptrace()
687 sizeof(u_long) * r.sr.pscr_nargs); in sys_ptrace()
690 r.sr.pscr_args = pscr_args; in sys_ptrace()
693 addr = uap->addr; in sys_ptrace()
699 error = kern_ptrace(td, uap->req, uap->pid, addr, uap->data); in sys_ptrace()
703 switch (uap->req) { in sys_ptrace()
705 error = copyout(&r.pve, uap->addr, sizeof(r.pve)); in sys_ptrace()
708 error = copyout(&r.piod, uap->addr, sizeof(r.piod)); in sys_ptrace()
711 error = copyout(&r.reg, uap->addr, sizeof(r.reg)); in sys_ptrace()
714 error = copyout(&r.fpreg, uap->addr, sizeof(r.fpreg)); in sys_ptrace()
717 error = copyout(&r.dbreg, uap->addr, sizeof(r.dbreg)); in sys_ptrace()
720 error = copyout(&r.vec, uap->addr, sizeof(r.vec)); in sys_ptrace()
723 /* NB: The size in uap->data is validated in kern_ptrace(). */ in sys_ptrace()
724 error = copyout(&r.ptevents, uap->addr, uap->data); in sys_ptrace()
727 /* NB: The size in uap->data is validated in kern_ptrace(). */ in sys_ptrace()
728 error = copyout(&r.pl, uap->addr, uap->data); in sys_ptrace()
731 error = copyout(r.args, uap->addr, MIN(uap->data, in sys_ptrace()
735 error = copyout(&r.psr, uap->addr, MIN(uap->data, in sys_ptrace()
739 error = copyout(&r.sr.pscr_ret, uap->addr + in sys_ptrace()
741 sizeof(r.sr.pscr_ret)); in sys_ptrace()
776 p->p_flag |= P_TRACED; in proc_set_traced()
778 p->p_flag2 |= P2_PTRACE_FSTP; in proc_set_traced()
779 p->p_ptevents = PTRACE_DEFAULT; in proc_set_traced()
788 p->p_flag &= ~(P_STOPPED_TRACE | P_STOPPED_SIG | P_WAITED); in ptrace_unsuspend()
802 if ((p->p_flag & P_WEXIT) != 0) in proc_can_ptrace()
811 if ((p->p_flag & P_TRACED) == 0) in proc_can_ptrace()
815 if (p->p_pptr != td->td_proc) in proc_can_ptrace()
819 if ((p->p_flag & P_STOPPED_TRACE) == 0 || in proc_can_ptrace()
820 p->p_suspcount != p->p_numthreads || in proc_can_ptrace()
821 (p->p_flag & P_WAITED) == 0) in proc_can_ptrace()
833 MPASS((p->p_flag & P_STOPPED_TRACE) != 0); in ptrace_sel_coredump_thread()
836 if ((td2->td_dbgflags & TDB_SSWITCH) != 0) in ptrace_sel_coredump_thread()
845 struct iovec iov; in kern_ptrace() local
864 curp = td->td_proc; in kern_ptrace()
891 p = td->td_proc; in kern_ptrace()
901 td2 = tdfind(pid, -1); in kern_ptrace()
907 p = td2->td_proc; in kern_ptrace()
909 pid = p->p_pid; in kern_ptrace()
914 if ((p->p_flag & P_WEXIT) != 0) { in kern_ptrace()
927 if ((p->p_flag & P_SYSTEM) != 0) { in kern_ptrace()
933 if ((p->p_flag & P_STOPPED_TRACE) != 0) { in kern_ptrace()
934 KASSERT(p->p_xthread != NULL, ("NULL p_xthread")); in kern_ptrace()
935 td2 = p->p_xthread; in kern_ptrace()
939 tid = td2->td_tid; in kern_ptrace()
948 if (SV_PROC_FLAG(td2->td_proc, SV_ILP32)) in kern_ptrace()
962 if ((p->p_flag & P_TRACED) != 0) { in kern_ptrace()
966 if (p->p_pptr == initproc) { in kern_ptrace()
974 if (p == td->td_proc) { in kern_ptrace()
980 if (p->p_flag & P_TRACED) { in kern_ptrace()
986 if (curp->p_flag & P_TRACED) { in kern_ptrace()
987 for (pp = curp->p_pptr; pp != NULL; pp = pp->p_pptr) { in kern_ptrace()
1000 if (td->td_tid == tid) in kern_ptrace()
1018 while ((p->p_flag2 & P2_PTRACEREQ) != 0) { in kern_ptrace()
1021 error = msleep(&p->p_flag2, &p->p_mtx, PPAUSE | PCATCH | in kern_ptrace()
1027 if (error == 0 && td2->td_proc != p) in kern_ptrace()
1043 MPASS((p->p_flag2 & P2_PTRACEREQ) == 0); in kern_ptrace()
1044 p->p_flag2 |= P2_PTRACEREQ; in kern_ptrace()
1052 td->td_retval[0] = 0; in kern_ptrace()
1058 if (p->p_flag & P_PPWAIT) in kern_ptrace()
1059 p->p_flag |= P_PPTRACE; in kern_ptrace()
1060 CTR1(KTR_PTRACE, "PT_TRACE_ME: pid %d", p->p_pid); in kern_ptrace()
1070 * we just re-parent the process we're trying to trace. in kern_ptrace()
1075 proc_reparent(p, td->td_proc, false); in kern_ptrace()
1076 CTR2(KTR_PTRACE, "PT_ATTACH: pid %d, oppid %d", p->p_pid, in kern_ptrace()
1077 p->p_oppid); in kern_ptrace()
1081 MPASS(p->p_xthread == NULL); in kern_ptrace()
1082 MPASS((p->p_flag & P_STOPPED_TRACE) == 0); in kern_ptrace()
1088 if ((p->p_flag & P_STOPPED_SIG) != 0) { in kern_ptrace()
1090 p->p_flag &= ~(P_STOPPED_SIG | P_WAITED); in kern_ptrace()
1099 CTR2(KTR_PTRACE, "PT_CLEARSTEP: tid %d (pid %d)", td2->td_tid, in kern_ptrace()
1100 p->p_pid); in kern_ptrace()
1105 CTR2(KTR_PTRACE, "PT_SETSTEP: tid %d (pid %d)", td2->td_tid, in kern_ptrace()
1106 p->p_pid); in kern_ptrace()
1111 CTR2(KTR_PTRACE, "PT_SUSPEND: tid %d (pid %d)", td2->td_tid, in kern_ptrace()
1112 p->p_pid); in kern_ptrace()
1113 td2->td_dbgflags |= TDB_SUSPEND; in kern_ptrace()
1118 CTR2(KTR_PTRACE, "PT_RESUME: tid %d (pid %d)", td2->td_tid, in kern_ptrace()
1119 p->p_pid); in kern_ptrace()
1120 td2->td_dbgflags &= ~TDB_SUSPEND; in kern_ptrace()
1124 CTR3(KTR_PTRACE, "PT_FOLLOW_FORK: pid %d %s -> %s", p->p_pid, in kern_ptrace()
1125 p->p_ptevents & PTRACE_FORK ? "enabled" : "disabled", in kern_ptrace()
1128 p->p_ptevents |= PTRACE_FORK; in kern_ptrace()
1130 p->p_ptevents &= ~PTRACE_FORK; in kern_ptrace()
1134 CTR3(KTR_PTRACE, "PT_LWP_EVENTS: pid %d %s -> %s", p->p_pid, in kern_ptrace()
1135 p->p_ptevents & PTRACE_LWP ? "enabled" : "disabled", in kern_ptrace()
1138 p->p_ptevents |= PTRACE_LWP; in kern_ptrace()
1140 p->p_ptevents &= ~PTRACE_LWP; in kern_ptrace()
1144 if (data != sizeof(p->p_ptevents)) { in kern_ptrace()
1148 CTR2(KTR_PTRACE, "PT_GET_EVENT_MASK: pid %d mask %#x", p->p_pid, in kern_ptrace()
1149 p->p_ptevents); in kern_ptrace()
1150 *(int *)addr = p->p_ptevents; in kern_ptrace()
1154 if (data != sizeof(p->p_ptevents)) { in kern_ptrace()
1164 CTR3(KTR_PTRACE, "PT_SET_EVENT_MASK: pid %d mask %#x -> %#x", in kern_ptrace()
1165 p->p_pid, p->p_ptevents, tmp); in kern_ptrace()
1166 p->p_ptevents = tmp; in kern_ptrace()
1170 CTR1(KTR_PTRACE, "PT_GET_SC_ARGS: pid %d", p->p_pid); in kern_ptrace()
1171 if ((td2->td_dbgflags & (TDB_SCE | TDB_SCX)) == 0 in kern_ptrace()
1179 bzero(addr, sizeof(td2->td_sa.args)); in kern_ptrace()
1181 bcopy(td2->td_sa.args, addr, SV_PROC_ABI(td->td_proc) == in kern_ptrace()
1182 SV_ABI_LINUX ? sizeof(td2->td_sa.args) : in kern_ptrace()
1183 td2->td_sa.callp->sy_narg * sizeof(syscallarg_t)); in kern_ptrace()
1187 if ((td2->td_dbgflags & (TDB_SCX)) == 0 in kern_ptrace()
1197 psr->sr_error = td2->td_errno; in kern_ptrace()
1198 if (psr->sr_error == 0) { in kern_ptrace()
1199 psr->sr_retval[0] = td2->td_retval[0]; in kern_ptrace()
1200 psr->sr_retval[1] = td2->td_retval[1]; in kern_ptrace()
1204 p->p_pid, psr->sr_error, psr->sr_retval[0], in kern_ptrace()
1205 psr->sr_retval[1]); in kern_ptrace()
1223 td2->td_tid, p->p_pid, data); in kern_ptrace()
1240 p->p_ptevents |= PTRACE_SCE; in kern_ptrace()
1243 p->p_pid, p->p_ptevents, in kern_ptrace()
1247 p->p_ptevents |= PTRACE_SCX; in kern_ptrace()
1250 p->p_pid, p->p_ptevents, in kern_ptrace()
1254 p->p_ptevents |= PTRACE_SYSCALL; in kern_ptrace()
1257 p->p_pid, p->p_ptevents, in kern_ptrace()
1263 p->p_pid, (u_long)(uintfptr_t)addr, data); in kern_ptrace()
1274 p->p_flag &= ~(P_TRACED | P_WAITED); in kern_ptrace()
1279 if (p->p_oppid != p->p_pptr->p_pid) { in kern_ptrace()
1280 PROC_LOCK(p->p_pptr); in kern_ptrace()
1281 sigqueue_take(p->p_ksi); in kern_ptrace()
1282 PROC_UNLOCK(p->p_pptr); in kern_ptrace()
1287 p->p_sigparent = SIGCHLD; in kern_ptrace()
1290 p->p_pid, pp->p_pid, data); in kern_ptrace()
1293 p->p_pid, data); in kern_ptrace()
1296 p->p_ptevents = 0; in kern_ptrace()
1298 if ((td3->td_dbgflags & TDB_FSTP) != 0) { in kern_ptrace()
1299 sigqueue_delete(&td3->td_sigqueue, in kern_ptrace()
1302 td3->td_dbgflags &= ~(TDB_XSIG | TDB_FSTP | in kern_ptrace()
1306 if ((p->p_flag2 & P2_PTRACE_FSTP) != 0) { in kern_ptrace()
1307 sigqueue_delete(&p->p_sigqueue, SIGSTOP); in kern_ptrace()
1308 p->p_flag2 &= ~P2_PTRACE_FSTP; in kern_ptrace()
1330 MPASS(p->p_xthread != NULL); in kern_ptrace()
1331 p->p_xthread->td_dbgflags &= ~TDB_XSIG; in kern_ptrace()
1332 p->p_xthread->td_xsig = data; in kern_ptrace()
1333 p->p_xthread = NULL; in kern_ptrace()
1334 p->p_xsig = data; in kern_ptrace()
1356 td2->td_dbgflags |= TDB_USERWR; in kern_ptrace()
1364 p->p_pid, addr, data); in kern_ptrace()
1377 p->p_pid, addr, tmp); in kern_ptrace()
1378 td->td_retval[0] = tmp; in kern_ptrace()
1384 iov.iov_base = piod->piod_addr; in kern_ptrace()
1385 iov.iov_len = piod->piod_len; in kern_ptrace()
1386 uio.uio_offset = (off_t)(uintptr_t)piod->piod_offs; in kern_ptrace()
1387 uio.uio_resid = piod->piod_len; in kern_ptrace()
1388 uio.uio_iov = &iov; in kern_ptrace()
1392 switch (piod->piod_op) { in kern_ptrace()
1396 p->p_pid, (uintptr_t)uio.uio_offset, uio.uio_resid); in kern_ptrace()
1402 p->p_pid, (uintptr_t)uio.uio_offset, uio.uio_resid); in kern_ptrace()
1403 td2->td_dbgflags |= TDB_USERWR; in kern_ptrace()
1412 piod->piod_len -= uio.uio_resid; in kern_ptrace()
1417 CTR1(KTR_PTRACE, "PT_KILL: pid %d", p->p_pid); in kern_ptrace()
1422 CTR2(KTR_PTRACE, "PT_SETREGS: tid %d (pid %d)", td2->td_tid, in kern_ptrace()
1423 p->p_pid); in kern_ptrace()
1424 td2->td_dbgflags |= TDB_USERWR; in kern_ptrace()
1429 CTR2(KTR_PTRACE, "PT_GETREGS: tid %d (pid %d)", td2->td_tid, in kern_ptrace()
1430 p->p_pid); in kern_ptrace()
1435 CTR2(KTR_PTRACE, "PT_SETFPREGS: tid %d (pid %d)", td2->td_tid, in kern_ptrace()
1436 p->p_pid); in kern_ptrace()
1437 td2->td_dbgflags |= TDB_USERWR; in kern_ptrace()
1442 CTR2(KTR_PTRACE, "PT_GETFPREGS: tid %d (pid %d)", td2->td_tid, in kern_ptrace()
1443 p->p_pid); in kern_ptrace()
1448 CTR2(KTR_PTRACE, "PT_SETDBREGS: tid %d (pid %d)", td2->td_tid, in kern_ptrace()
1449 p->p_pid); in kern_ptrace()
1450 td2->td_dbgflags |= TDB_USERWR; in kern_ptrace()
1455 CTR2(KTR_PTRACE, "PT_GETDBREGS: tid %d (pid %d)", td2->td_tid, in kern_ptrace()
1456 p->p_pid); in kern_ptrace()
1461 CTR2(KTR_PTRACE, "PT_SETREGSET: tid %d (pid %d)", td2->td_tid, in kern_ptrace()
1462 p->p_pid); in kern_ptrace()
1467 CTR2(KTR_PTRACE, "PT_GETREGSET: tid %d (pid %d)", td2->td_tid, in kern_ptrace()
1468 p->p_pid); in kern_ptrace()
1479 pl->pl_lwpid = td2->td_tid; in kern_ptrace()
1480 pl->pl_event = PL_EVENT_NONE; in kern_ptrace()
1481 pl->pl_flags = 0; in kern_ptrace()
1482 if (td2->td_dbgflags & TDB_XSIG) { in kern_ptrace()
1483 pl->pl_event = PL_EVENT_SIGNAL; in kern_ptrace()
1484 if (td2->td_si.si_signo != 0 && in kern_ptrace()
1486 + sizeof(pl->pl_siginfo)){ in kern_ptrace()
1487 pl->pl_flags |= PL_FLAG_SI; in kern_ptrace()
1488 pl->pl_siginfo = td2->td_si; in kern_ptrace()
1491 if (td2->td_dbgflags & TDB_SCE) in kern_ptrace()
1492 pl->pl_flags |= PL_FLAG_SCE; in kern_ptrace()
1493 else if (td2->td_dbgflags & TDB_SCX) in kern_ptrace()
1494 pl->pl_flags |= PL_FLAG_SCX; in kern_ptrace()
1495 if (td2->td_dbgflags & TDB_EXEC) in kern_ptrace()
1496 pl->pl_flags |= PL_FLAG_EXEC; in kern_ptrace()
1497 if (td2->td_dbgflags & TDB_FORK) { in kern_ptrace()
1498 pl->pl_flags |= PL_FLAG_FORKED; in kern_ptrace()
1499 pl->pl_child_pid = td2->td_dbg_forked; in kern_ptrace()
1500 if (td2->td_dbgflags & TDB_VFORK) in kern_ptrace()
1501 pl->pl_flags |= PL_FLAG_VFORKED; in kern_ptrace()
1502 } else if ((td2->td_dbgflags & (TDB_SCX | TDB_VFORK)) == in kern_ptrace()
1504 pl->pl_flags |= PL_FLAG_VFORK_DONE; in kern_ptrace()
1505 if (td2->td_dbgflags & TDB_CHILD) in kern_ptrace()
1506 pl->pl_flags |= PL_FLAG_CHILD; in kern_ptrace()
1507 if (td2->td_dbgflags & TDB_BORN) in kern_ptrace()
1508 pl->pl_flags |= PL_FLAG_BORN; in kern_ptrace()
1509 if (td2->td_dbgflags & TDB_EXIT) in kern_ptrace()
1510 pl->pl_flags |= PL_FLAG_EXITED; in kern_ptrace()
1511 pl->pl_sigmask = td2->td_sigmask; in kern_ptrace()
1512 pl->pl_siglist = td2->td_siglist; in kern_ptrace()
1513 strcpy(pl->pl_tdname, td2->td_name); in kern_ptrace()
1514 if ((td2->td_dbgflags & (TDB_SCE | TDB_SCX)) != 0) { in kern_ptrace()
1515 pl->pl_syscall_code = td2->td_sa.code; in kern_ptrace()
1516 pl->pl_syscall_narg = td2->td_sa.callp->sy_narg; in kern_ptrace()
1518 pl->pl_syscall_code = 0; in kern_ptrace()
1519 pl->pl_syscall_narg = 0; in kern_ptrace()
1523 td2->td_tid, p->p_pid, pl->pl_event, pl->pl_flags, in kern_ptrace()
1524 pl->pl_child_pid, pl->pl_syscall_code); in kern_ptrace()
1528 CTR2(KTR_PTRACE, "PT_GETNUMLWPS: pid %d: %d threads", p->p_pid, in kern_ptrace()
1529 p->p_numthreads); in kern_ptrace()
1530 td->td_retval[0] = p->p_numthreads; in kern_ptrace()
1535 p->p_pid, data, p->p_numthreads); in kern_ptrace()
1540 num = imin(p->p_numthreads, data); in kern_ptrace()
1548 buf[tmp++] = td2->td_tid; in kern_ptrace()
1554 td->td_retval[0] = tmp; in kern_ptrace()
1560 p->p_pid, p->p_vmspace->vm_map.timestamp); in kern_ptrace()
1561 td->td_retval[0] = p->p_vmspace->vm_map.timestamp; in kern_ptrace()
1573 p->p_pid, pc->pc_fd); in kern_ptrace()
1575 if ((pc->pc_flags & ~(PC_COMPRESS | PC_ALL)) != 0) { in kern_ptrace()
1583 error = fget_write(td, pc->pc_fd, &cap_write_rights, &fp); in kern_ptrace()
1586 if (fp->f_type != DTYPE_VNODE || fp->f_vnode->v_type != VREG) { in kern_ptrace()
1601 KASSERT((td2->td_dbgflags & (TDB_COREDUMPREQ | in kern_ptrace()
1603 ("proc %d tid %d req coredump", p->p_pid, td2->td_tid)); in kern_ptrace()
1605 tcq->tc_vp = fp->f_vnode; in kern_ptrace()
1606 tcq->tc_limit = pc->pc_limit == 0 ? OFF_MAX : pc->pc_limit; in kern_ptrace()
1607 tcq->tc_flags = SVC_PT_COREDUMP; in kern_ptrace()
1608 if ((pc->pc_flags & PC_COMPRESS) == 0) in kern_ptrace()
1609 tcq->tc_flags |= SVC_NOCOMPRESS; in kern_ptrace()
1610 if ((pc->pc_flags & PC_ALL) != 0) in kern_ptrace()
1611 tcq->tc_flags |= SVC_ALL; in kern_ptrace()
1612 td2->td_remotereq = tcq; in kern_ptrace()
1613 td2->td_dbgflags |= TDB_COREDUMPREQ; in kern_ptrace()
1615 while ((td2->td_dbgflags & TDB_COREDUMPREQ) != 0) in kern_ptrace()
1616 msleep(p, &p->p_mtx, PPAUSE, "crdmp", 0); in kern_ptrace()
1617 error = tcq->tc_error; in kern_ptrace()
1630 p->p_pid, pscr->pscr_syscall); in kern_ptrace()
1631 if ((td2->td_dbgflags & TDB_BOUNDARY) == 0) { in kern_ptrace()
1636 MPASS(pscr->pscr_nargs <= nitems(td->td_sa.args)); in kern_ptrace()
1641 tsr->ts_sa.code = pscr->pscr_syscall; in kern_ptrace()
1642 tsr->ts_nargs = pscr->pscr_nargs; in kern_ptrace()
1643 memcpy(&tsr->ts_sa.args, pscr->pscr_args, in kern_ptrace()
1644 sizeof(syscallarg_t) * tsr->ts_nargs); in kern_ptrace()
1652 if (td2->td_proc != p) { in kern_ptrace()
1657 KASSERT((td2->td_dbgflags & (TDB_COREDUMPREQ | in kern_ptrace()
1659 ("proc %d tid %d req coredump", p->p_pid, td2->td_tid)); in kern_ptrace()
1661 td2->td_remotereq = tsr; in kern_ptrace()
1662 td2->td_dbgflags |= TDB_SCREMOTEREQ; in kern_ptrace()
1664 while ((td2->td_dbgflags & TDB_SCREMOTEREQ) != 0) in kern_ptrace()
1665 msleep(p, &p->p_mtx, PPAUSE, "pscrx", 0); in kern_ptrace()
1667 memcpy(&pscr->pscr_ret, &tsr->ts_ret, sizeof(tsr->ts_ret)); in kern_ptrace()
1688 if ((p->p_flag2 & P2_PTRACEREQ) != 0) in kern_ptrace()
1689 wakeup(&p->p_flag2); in kern_ptrace()
1690 p->p_flag2 &= ~P2_PTRACEREQ; in kern_ptrace()