]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/kern/sys_process.c
ptrace: do not allow for parallel ptrace requests
[FreeBSD/FreeBSD.git] / sys / kern / sys_process.c
1 /*-
2  * SPDX-License-Identifier: BSD-4-Clause
3  *
4  * Copyright (c) 1994, Sean Eric Fagan
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. All advertising materials mentioning features or use of this software
16  *    must display the following acknowledgement:
17  *      This product includes software developed by Sean Eric Fagan.
18  * 4. The name of the author may not be used to endorse or promote products
19  *    derived from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  */
33
34 #include <sys/cdefs.h>
35 __FBSDID("$FreeBSD$");
36
37 #include <sys/param.h>
38 #include <sys/systm.h>
39 #include <sys/ktr.h>
40 #include <sys/limits.h>
41 #include <sys/lock.h>
42 #include <sys/mutex.h>
43 #include <sys/syscallsubr.h>
44 #include <sys/sysent.h>
45 #include <sys/sysproto.h>
46 #include <sys/priv.h>
47 #include <sys/proc.h>
48 #include <sys/vnode.h>
49 #include <sys/ptrace.h>
50 #include <sys/rwlock.h>
51 #include <sys/sx.h>
52 #include <sys/malloc.h>
53 #include <sys/signalvar.h>
54
55 #include <machine/reg.h>
56
57 #include <security/audit/audit.h>
58
59 #include <vm/vm.h>
60 #include <vm/pmap.h>
61 #include <vm/vm_extern.h>
62 #include <vm/vm_map.h>
63 #include <vm/vm_kern.h>
64 #include <vm/vm_object.h>
65 #include <vm/vm_page.h>
66 #include <vm/vm_param.h>
67
68 #ifdef COMPAT_FREEBSD32
69 #include <sys/procfs.h>
70 #endif
71
72 /*
73  * Functions implemented using PROC_ACTION():
74  *
75  * proc_read_regs(proc, regs)
76  *      Get the current user-visible register set from the process
77  *      and copy it into the regs structure (<machine/reg.h>).
78  *      The process is stopped at the time read_regs is called.
79  *
80  * proc_write_regs(proc, regs)
81  *      Update the current register set from the passed in regs
82  *      structure.  Take care to avoid clobbering special CPU
83  *      registers or privileged bits in the PSL.
84  *      Depending on the architecture this may have fix-up work to do,
85  *      especially if the IAR or PCW are modified.
86  *      The process is stopped at the time write_regs is called.
87  *
88  * proc_read_fpregs, proc_write_fpregs
89  *      deal with the floating point register set, otherwise as above.
90  *
91  * proc_read_dbregs, proc_write_dbregs
92  *      deal with the processor debug register set, otherwise as above.
93  *
94  * proc_sstep(proc)
95  *      Arrange for the process to trap after executing a single instruction.
96  */
97
98 #define PROC_ACTION(action) do {                                        \
99         int error;                                                      \
100                                                                         \
101         PROC_LOCK_ASSERT(td->td_proc, MA_OWNED);                        \
102         if ((td->td_proc->p_flag & P_INMEM) == 0)                       \
103                 error = EIO;                                            \
104         else                                                            \
105                 error = (action);                                       \
106         return (error);                                                 \
107 } while(0)
108
109 int
110 proc_read_regs(struct thread *td, struct reg *regs)
111 {
112
113         PROC_ACTION(fill_regs(td, regs));
114 }
115
116 int
117 proc_write_regs(struct thread *td, struct reg *regs)
118 {
119
120         PROC_ACTION(set_regs(td, regs));
121 }
122
123 int
124 proc_read_dbregs(struct thread *td, struct dbreg *dbregs)
125 {
126
127         PROC_ACTION(fill_dbregs(td, dbregs));
128 }
129
130 int
131 proc_write_dbregs(struct thread *td, struct dbreg *dbregs)
132 {
133
134         PROC_ACTION(set_dbregs(td, dbregs));
135 }
136
137 /*
138  * Ptrace doesn't support fpregs at all, and there are no security holes
139  * or translations for fpregs, so we can just copy them.
140  */
141 int
142 proc_read_fpregs(struct thread *td, struct fpreg *fpregs)
143 {
144
145         PROC_ACTION(fill_fpregs(td, fpregs));
146 }
147
148 int
149 proc_write_fpregs(struct thread *td, struct fpreg *fpregs)
150 {
151
152         PROC_ACTION(set_fpregs(td, fpregs));
153 }
154
155 #ifdef COMPAT_FREEBSD32
156 /* For 32 bit binaries, we need to expose the 32 bit regs layouts. */
157 int
158 proc_read_regs32(struct thread *td, struct reg32 *regs32)
159 {
160
161         PROC_ACTION(fill_regs32(td, regs32));
162 }
163
164 int
165 proc_write_regs32(struct thread *td, struct reg32 *regs32)
166 {
167
168         PROC_ACTION(set_regs32(td, regs32));
169 }
170
171 int
172 proc_read_dbregs32(struct thread *td, struct dbreg32 *dbregs32)
173 {
174
175         PROC_ACTION(fill_dbregs32(td, dbregs32));
176 }
177
178 int
179 proc_write_dbregs32(struct thread *td, struct dbreg32 *dbregs32)
180 {
181
182         PROC_ACTION(set_dbregs32(td, dbregs32));
183 }
184
185 int
186 proc_read_fpregs32(struct thread *td, struct fpreg32 *fpregs32)
187 {
188
189         PROC_ACTION(fill_fpregs32(td, fpregs32));
190 }
191
192 int
193 proc_write_fpregs32(struct thread *td, struct fpreg32 *fpregs32)
194 {
195
196         PROC_ACTION(set_fpregs32(td, fpregs32));
197 }
198 #endif
199
200 int
201 proc_sstep(struct thread *td)
202 {
203
204         PROC_ACTION(ptrace_single_step(td));
205 }
206
207 int
208 proc_rwmem(struct proc *p, struct uio *uio)
209 {
210         vm_map_t map;
211         vm_offset_t pageno;             /* page number */
212         vm_prot_t reqprot;
213         int error, fault_flags, page_offset, writing;
214
215         /*
216          * Assert that someone has locked this vmspace.  (Should be
217          * curthread but we can't assert that.)  This keeps the process
218          * from exiting out from under us until this operation completes.
219          */
220         PROC_ASSERT_HELD(p);
221         PROC_LOCK_ASSERT(p, MA_NOTOWNED);
222
223         /*
224          * The map we want...
225          */
226         map = &p->p_vmspace->vm_map;
227
228         /*
229          * If we are writing, then we request vm_fault() to create a private
230          * copy of each page.  Since these copies will not be writeable by the
231          * process, we must explicity request that they be dirtied.
232          */
233         writing = uio->uio_rw == UIO_WRITE;
234         reqprot = writing ? VM_PROT_COPY | VM_PROT_READ : VM_PROT_READ;
235         fault_flags = writing ? VM_FAULT_DIRTY : VM_FAULT_NORMAL;
236
237         /*
238          * Only map in one page at a time.  We don't have to, but it
239          * makes things easier.  This way is trivial - right?
240          */
241         do {
242                 vm_offset_t uva;
243                 u_int len;
244                 vm_page_t m;
245
246                 uva = (vm_offset_t)uio->uio_offset;
247
248                 /*
249                  * Get the page number of this segment.
250                  */
251                 pageno = trunc_page(uva);
252                 page_offset = uva - pageno;
253
254                 /*
255                  * How many bytes to copy
256                  */
257                 len = min(PAGE_SIZE - page_offset, uio->uio_resid);
258
259                 /*
260                  * Fault and hold the page on behalf of the process.
261                  */
262                 error = vm_fault(map, pageno, reqprot, fault_flags, &m);
263                 if (error != KERN_SUCCESS) {
264                         if (error == KERN_RESOURCE_SHORTAGE)
265                                 error = ENOMEM;
266                         else
267                                 error = EFAULT;
268                         break;
269                 }
270
271                 /*
272                  * Now do the i/o move.
273                  */
274                 error = uiomove_fromphys(&m, page_offset, len, uio);
275
276                 /* Make the I-cache coherent for breakpoints. */
277                 if (writing && error == 0) {
278                         vm_map_lock_read(map);
279                         if (vm_map_check_protection(map, pageno, pageno +
280                             PAGE_SIZE, VM_PROT_EXECUTE))
281                                 vm_sync_icache(map, uva, len);
282                         vm_map_unlock_read(map);
283                 }
284
285                 /*
286                  * Release the page.
287                  */
288                 vm_page_unwire(m, PQ_ACTIVE);
289
290         } while (error == 0 && uio->uio_resid > 0);
291
292         return (error);
293 }
294
295 static ssize_t
296 proc_iop(struct thread *td, struct proc *p, vm_offset_t va, void *buf,
297     size_t len, enum uio_rw rw)
298 {
299         struct iovec iov;
300         struct uio uio;
301         ssize_t slen;
302
303         MPASS(len < SSIZE_MAX);
304         slen = (ssize_t)len;
305
306         iov.iov_base = (caddr_t)buf;
307         iov.iov_len = len;
308         uio.uio_iov = &iov;
309         uio.uio_iovcnt = 1;
310         uio.uio_offset = va;
311         uio.uio_resid = slen;
312         uio.uio_segflg = UIO_SYSSPACE;
313         uio.uio_rw = rw;
314         uio.uio_td = td;
315         proc_rwmem(p, &uio);
316         if (uio.uio_resid == slen)
317                 return (-1);
318         return (slen - uio.uio_resid);
319 }
320
321 ssize_t
322 proc_readmem(struct thread *td, struct proc *p, vm_offset_t va, void *buf,
323     size_t len)
324 {
325
326         return (proc_iop(td, p, va, buf, len, UIO_READ));
327 }
328
329 ssize_t
330 proc_writemem(struct thread *td, struct proc *p, vm_offset_t va, void *buf,
331     size_t len)
332 {
333
334         return (proc_iop(td, p, va, buf, len, UIO_WRITE));
335 }
336
337 static int
338 ptrace_vm_entry(struct thread *td, struct proc *p, struct ptrace_vm_entry *pve)
339 {
340         struct vattr vattr;
341         vm_map_t map;
342         vm_map_entry_t entry;
343         vm_object_t obj, tobj, lobj;
344         struct vmspace *vm;
345         struct vnode *vp;
346         char *freepath, *fullpath;
347         u_int pathlen;
348         int error, index;
349
350         error = 0;
351         obj = NULL;
352
353         vm = vmspace_acquire_ref(p);
354         map = &vm->vm_map;
355         vm_map_lock_read(map);
356
357         do {
358                 KASSERT((map->header.eflags & MAP_ENTRY_IS_SUB_MAP) == 0,
359                     ("Submap in map header"));
360                 index = 0;
361                 VM_MAP_ENTRY_FOREACH(entry, map) {
362                         if (index >= pve->pve_entry &&
363                             (entry->eflags & MAP_ENTRY_IS_SUB_MAP) == 0)
364                                 break;
365                         index++;
366                 }
367                 if (index < pve->pve_entry) {
368                         error = EINVAL;
369                         break;
370                 }
371                 if (entry == &map->header) {
372                         error = ENOENT;
373                         break;
374                 }
375
376                 /* We got an entry. */
377                 pve->pve_entry = index + 1;
378                 pve->pve_timestamp = map->timestamp;
379                 pve->pve_start = entry->start;
380                 pve->pve_end = entry->end - 1;
381                 pve->pve_offset = entry->offset;
382                 pve->pve_prot = entry->protection;
383
384                 /* Backing object's path needed? */
385                 if (pve->pve_pathlen == 0)
386                         break;
387
388                 pathlen = pve->pve_pathlen;
389                 pve->pve_pathlen = 0;
390
391                 obj = entry->object.vm_object;
392                 if (obj != NULL)
393                         VM_OBJECT_RLOCK(obj);
394         } while (0);
395
396         vm_map_unlock_read(map);
397
398         pve->pve_fsid = VNOVAL;
399         pve->pve_fileid = VNOVAL;
400
401         if (error == 0 && obj != NULL) {
402                 lobj = obj;
403                 for (tobj = obj; tobj != NULL; tobj = tobj->backing_object) {
404                         if (tobj != obj)
405                                 VM_OBJECT_RLOCK(tobj);
406                         if (lobj != obj)
407                                 VM_OBJECT_RUNLOCK(lobj);
408                         lobj = tobj;
409                         pve->pve_offset += tobj->backing_object_offset;
410                 }
411                 vp = vm_object_vnode(lobj);
412                 if (vp != NULL)
413                         vref(vp);
414                 if (lobj != obj)
415                         VM_OBJECT_RUNLOCK(lobj);
416                 VM_OBJECT_RUNLOCK(obj);
417
418                 if (vp != NULL) {
419                         freepath = NULL;
420                         fullpath = NULL;
421                         vn_fullpath(vp, &fullpath, &freepath);
422                         vn_lock(vp, LK_SHARED | LK_RETRY);
423                         if (VOP_GETATTR(vp, &vattr, td->td_ucred) == 0) {
424                                 pve->pve_fileid = vattr.va_fileid;
425                                 pve->pve_fsid = vattr.va_fsid;
426                         }
427                         vput(vp);
428
429                         if (fullpath != NULL) {
430                                 pve->pve_pathlen = strlen(fullpath) + 1;
431                                 if (pve->pve_pathlen <= pathlen) {
432                                         error = copyout(fullpath, pve->pve_path,
433                                             pve->pve_pathlen);
434                                 } else
435                                         error = ENAMETOOLONG;
436                         }
437                         if (freepath != NULL)
438                                 free(freepath, M_TEMP);
439                 }
440         }
441         vmspace_free(vm);
442         if (error == 0)
443                 CTR3(KTR_PTRACE, "PT_VM_ENTRY: pid %d, entry %d, start %p",
444                     p->p_pid, pve->pve_entry, pve->pve_start);
445
446         return (error);
447 }
448
449 /*
450  * Process debugging system call.
451  */
452 #ifndef _SYS_SYSPROTO_H_
453 struct ptrace_args {
454         int     req;
455         pid_t   pid;
456         caddr_t addr;
457         int     data;
458 };
459 #endif
460
461 int
462 sys_ptrace(struct thread *td, struct ptrace_args *uap)
463 {
464         /*
465          * XXX this obfuscation is to reduce stack usage, but the register
466          * structs may be too large to put on the stack anyway.
467          */
468         union {
469                 struct ptrace_io_desc piod;
470                 struct ptrace_lwpinfo pl;
471                 struct ptrace_vm_entry pve;
472                 struct dbreg dbreg;
473                 struct fpreg fpreg;
474                 struct reg reg;
475                 char args[sizeof(td->td_sa.args)];
476                 struct ptrace_sc_ret psr;
477                 int ptevents;
478         } r;
479         void *addr;
480         int error = 0;
481
482         AUDIT_ARG_PID(uap->pid);
483         AUDIT_ARG_CMD(uap->req);
484         AUDIT_ARG_VALUE(uap->data);
485         addr = &r;
486         switch (uap->req) {
487         case PT_GET_EVENT_MASK:
488         case PT_LWPINFO:
489         case PT_GET_SC_ARGS:
490         case PT_GET_SC_RET:
491                 break;
492         case PT_GETREGS:
493                 bzero(&r.reg, sizeof(r.reg));
494                 break;
495         case PT_GETFPREGS:
496                 bzero(&r.fpreg, sizeof(r.fpreg));
497                 break;
498         case PT_GETDBREGS:
499                 bzero(&r.dbreg, sizeof(r.dbreg));
500                 break;
501         case PT_SETREGS:
502                 error = copyin(uap->addr, &r.reg, sizeof(r.reg));
503                 break;
504         case PT_SETFPREGS:
505                 error = copyin(uap->addr, &r.fpreg, sizeof(r.fpreg));
506                 break;
507         case PT_SETDBREGS:
508                 error = copyin(uap->addr, &r.dbreg, sizeof(r.dbreg));
509                 break;
510         case PT_SET_EVENT_MASK:
511                 if (uap->data != sizeof(r.ptevents))
512                         error = EINVAL;
513                 else
514                         error = copyin(uap->addr, &r.ptevents, uap->data);
515                 break;
516         case PT_IO:
517                 error = copyin(uap->addr, &r.piod, sizeof(r.piod));
518                 break;
519         case PT_VM_ENTRY:
520                 error = copyin(uap->addr, &r.pve, sizeof(r.pve));
521                 break;
522         default:
523                 addr = uap->addr;
524                 break;
525         }
526         if (error)
527                 return (error);
528
529         error = kern_ptrace(td, uap->req, uap->pid, addr, uap->data);
530         if (error)
531                 return (error);
532
533         switch (uap->req) {
534         case PT_VM_ENTRY:
535                 error = copyout(&r.pve, uap->addr, sizeof(r.pve));
536                 break;
537         case PT_IO:
538                 error = copyout(&r.piod, uap->addr, sizeof(r.piod));
539                 break;
540         case PT_GETREGS:
541                 error = copyout(&r.reg, uap->addr, sizeof(r.reg));
542                 break;
543         case PT_GETFPREGS:
544                 error = copyout(&r.fpreg, uap->addr, sizeof(r.fpreg));
545                 break;
546         case PT_GETDBREGS:
547                 error = copyout(&r.dbreg, uap->addr, sizeof(r.dbreg));
548                 break;
549         case PT_GET_EVENT_MASK:
550                 /* NB: The size in uap->data is validated in kern_ptrace(). */
551                 error = copyout(&r.ptevents, uap->addr, uap->data);
552                 break;
553         case PT_LWPINFO:
554                 /* NB: The size in uap->data is validated in kern_ptrace(). */
555                 error = copyout(&r.pl, uap->addr, uap->data);
556                 break;
557         case PT_GET_SC_ARGS:
558                 error = copyout(r.args, uap->addr, MIN(uap->data,
559                     sizeof(r.args)));
560                 break;
561         case PT_GET_SC_RET:
562                 error = copyout(&r.psr, uap->addr, MIN(uap->data,
563                     sizeof(r.psr)));
564                 break;
565         }
566
567         return (error);
568 }
569
570 #ifdef COMPAT_FREEBSD32
571 /*
572  *   PROC_READ(regs, td2, addr);
573  * becomes either:
574  *   proc_read_regs(td2, addr);
575  * or
576  *   proc_read_regs32(td2, addr);
577  * .. except this is done at runtime.  There is an additional
578  * complication in that PROC_WRITE disallows 32 bit consumers
579  * from writing to 64 bit address space targets.
580  */
581 #define PROC_READ(w, t, a)      wrap32 ? \
582         proc_read_ ## w ## 32(t, a) : \
583         proc_read_ ## w (t, a)
584 #define PROC_WRITE(w, t, a)     wrap32 ? \
585         (safe ? proc_write_ ## w ## 32(t, a) : EINVAL ) : \
586         proc_write_ ## w (t, a)
587 #else
588 #define PROC_READ(w, t, a)      proc_read_ ## w (t, a)
589 #define PROC_WRITE(w, t, a)     proc_write_ ## w (t, a)
590 #endif
591
592 void
593 proc_set_traced(struct proc *p, bool stop)
594 {
595
596         sx_assert(&proctree_lock, SX_XLOCKED);
597         PROC_LOCK_ASSERT(p, MA_OWNED);
598         p->p_flag |= P_TRACED;
599         if (stop)
600                 p->p_flag2 |= P2_PTRACE_FSTP;
601         p->p_ptevents = PTRACE_DEFAULT;
602 }
603
604 static int
605 proc_can_ptrace(struct thread *td, struct proc *p)
606 {
607         int error;
608
609         PROC_LOCK_ASSERT(p, MA_OWNED);
610
611         if ((p->p_flag & P_WEXIT) != 0)
612                 return (ESRCH);
613
614         if ((error = p_cansee(td, p)) != 0)
615                 return (error);
616         if ((error = p_candebug(td, p)) != 0)
617                 return (error);
618
619         /* not being traced... */
620         if ((p->p_flag & P_TRACED) == 0)
621                 return (EPERM);
622
623         /* not being traced by YOU */
624         if (p->p_pptr != td->td_proc)
625                 return (EBUSY);
626
627         /* not currently stopped */
628         if ((p->p_flag & P_STOPPED_TRACE) == 0 ||
629             p->p_suspcount != p->p_numthreads  ||
630             (p->p_flag & P_WAITED) == 0)
631                 return (EBUSY);
632
633         return (0);
634 }
635 int
636 kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data)
637 {
638         struct iovec iov;
639         struct uio uio;
640         struct proc *curp, *p, *pp;
641         struct thread *td2 = NULL, *td3;
642         struct ptrace_io_desc *piod = NULL;
643         struct ptrace_lwpinfo *pl;
644         struct ptrace_sc_ret *psr;
645         int error, num, tmp;
646         lwpid_t tid = 0, *buf;
647 #ifdef COMPAT_FREEBSD32
648         int wrap32 = 0, safe = 0;
649 #endif
650         bool proctree_locked, p2_req_set;
651
652         curp = td->td_proc;
653         proctree_locked = false;
654         p2_req_set = false;
655
656         /* Lock proctree before locking the process. */
657         switch (req) {
658         case PT_TRACE_ME:
659         case PT_ATTACH:
660         case PT_STEP:
661         case PT_CONTINUE:
662         case PT_TO_SCE:
663         case PT_TO_SCX:
664         case PT_SYSCALL:
665         case PT_FOLLOW_FORK:
666         case PT_LWP_EVENTS:
667         case PT_GET_EVENT_MASK:
668         case PT_SET_EVENT_MASK:
669         case PT_DETACH:
670         case PT_GET_SC_ARGS:
671                 sx_xlock(&proctree_lock);
672                 proctree_locked = true;
673                 break;
674         default:
675                 break;
676         }
677
678         if (req == PT_TRACE_ME) {
679                 p = td->td_proc;
680                 PROC_LOCK(p);
681         } else {
682                 if (pid <= PID_MAX) {
683                         if ((p = pfind(pid)) == NULL) {
684                                 if (proctree_locked)
685                                         sx_xunlock(&proctree_lock);
686                                 return (ESRCH);
687                         }
688                 } else {
689                         td2 = tdfind(pid, -1);
690                         if (td2 == NULL) {
691                                 if (proctree_locked)
692                                         sx_xunlock(&proctree_lock);
693                                 return (ESRCH);
694                         }
695                         p = td2->td_proc;
696                         tid = pid;
697                         pid = p->p_pid;
698                 }
699         }
700         AUDIT_ARG_PROCESS(p);
701
702         if ((p->p_flag & P_WEXIT) != 0) {
703                 error = ESRCH;
704                 goto fail;
705         }
706         if ((error = p_cansee(td, p)) != 0)
707                 goto fail;
708
709         if ((error = p_candebug(td, p)) != 0)
710                 goto fail;
711
712         /*
713          * System processes can't be debugged.
714          */
715         if ((p->p_flag & P_SYSTEM) != 0) {
716                 error = EINVAL;
717                 goto fail;
718         }
719
720         if (tid == 0) {
721                 if ((p->p_flag & P_STOPPED_TRACE) != 0) {
722                         KASSERT(p->p_xthread != NULL, ("NULL p_xthread"));
723                         td2 = p->p_xthread;
724                 } else {
725                         td2 = FIRST_THREAD_IN_PROC(p);
726                 }
727                 tid = td2->td_tid;
728         }
729
730 #ifdef COMPAT_FREEBSD32
731         /*
732          * Test if we're a 32 bit client and what the target is.
733          * Set the wrap controls accordingly.
734          */
735         if (SV_CURPROC_FLAG(SV_ILP32)) {
736                 if (SV_PROC_FLAG(td2->td_proc, SV_ILP32))
737                         safe = 1;
738                 wrap32 = 1;
739         }
740 #endif
741         /*
742          * Permissions check
743          */
744         switch (req) {
745         case PT_TRACE_ME:
746                 /*
747                  * Always legal, when there is a parent process which
748                  * could trace us.  Otherwise, reject.
749                  */
750                 if ((p->p_flag & P_TRACED) != 0) {
751                         error = EBUSY;
752                         goto fail;
753                 }
754                 if (p->p_pptr == initproc) {
755                         error = EPERM;
756                         goto fail;
757                 }
758                 break;
759
760         case PT_ATTACH:
761                 /* Self */
762                 if (p == td->td_proc) {
763                         error = EINVAL;
764                         goto fail;
765                 }
766
767                 /* Already traced */
768                 if (p->p_flag & P_TRACED) {
769                         error = EBUSY;
770                         goto fail;
771                 }
772
773                 /* Can't trace an ancestor if you're being traced. */
774                 if (curp->p_flag & P_TRACED) {
775                         for (pp = curp->p_pptr; pp != NULL; pp = pp->p_pptr) {
776                                 if (pp == p) {
777                                         error = EINVAL;
778                                         goto fail;
779                                 }
780                         }
781                 }
782
783                 /* OK */
784                 break;
785
786         case PT_CLEARSTEP:
787                 /* Allow thread to clear single step for itself */
788                 if (td->td_tid == tid)
789                         break;
790
791                 /* FALLTHROUGH */
792         default:
793                 /*
794                  * Check for ptrace eligibility before waiting for
795                  * holds to drain.
796                  */
797                 error = proc_can_ptrace(td, p);
798                 if (error != 0)
799                         goto fail;
800
801                 /*
802                  * Block parallel ptrace requests.  Most important, do
803                  * not allow other thread in debugger to continue the
804                  * debuggee until coredump finished.
805                  */
806                 while ((p->p_flag2 & P2_PTRACEREQ) != 0) {
807                         if (proctree_locked)
808                                 sx_xunlock(&proctree_lock);
809                         error = msleep(&p->p_flag2, &p->p_mtx, PPAUSE | PCATCH |
810                             (proctree_locked ? PDROP : 0), "pptrace", 0);
811                         if (proctree_locked) {
812                                 sx_xlock(&proctree_lock);
813                                 PROC_LOCK(p);
814                         }
815                         if (error == 0 && td2->td_proc != p)
816                                 error = ESRCH;
817                         if (error == 0)
818                                 error = proc_can_ptrace(td, p);
819                         if (error != 0)
820                                 goto fail;
821                 }
822
823                 /* Ok */
824                 break;
825         }
826
827         /*
828          * Keep this process around and request parallel ptrace()
829          * request to wait until we finish this request.
830          */
831         MPASS((p->p_flag2 & P2_PTRACEREQ) == 0);
832         p->p_flag2 |= P2_PTRACEREQ;
833         p2_req_set = true;
834         _PHOLD(p);
835
836         /*
837          * Actually do the requests
838          */
839
840         td->td_retval[0] = 0;
841
842         switch (req) {
843         case PT_TRACE_ME:
844                 /* set my trace flag and "owner" so it can read/write me */
845                 proc_set_traced(p, false);
846                 if (p->p_flag & P_PPWAIT)
847                         p->p_flag |= P_PPTRACE;
848                 CTR1(KTR_PTRACE, "PT_TRACE_ME: pid %d", p->p_pid);
849                 break;
850
851         case PT_ATTACH:
852                 /* security check done above */
853                 /*
854                  * It would be nice if the tracing relationship was separate
855                  * from the parent relationship but that would require
856                  * another set of links in the proc struct or for "wait"
857                  * to scan the entire proc table.  To make life easier,
858                  * we just re-parent the process we're trying to trace.
859                  * The old parent is remembered so we can put things back
860                  * on a "detach".
861                  */
862                 proc_set_traced(p, true);
863                 proc_reparent(p, td->td_proc, false);
864                 CTR2(KTR_PTRACE, "PT_ATTACH: pid %d, oppid %d", p->p_pid,
865                     p->p_oppid);
866
867                 sx_xunlock(&proctree_lock);
868                 proctree_locked = false;
869                 MPASS(p->p_xthread == NULL);
870                 MPASS((p->p_flag & P_STOPPED_TRACE) == 0);
871
872                 /*
873                  * If already stopped due to a stop signal, clear the
874                  * existing stop before triggering a traced SIGSTOP.
875                  */
876                 if ((p->p_flag & P_STOPPED_SIG) != 0) {
877                         PROC_SLOCK(p);
878                         p->p_flag &= ~(P_STOPPED_SIG | P_WAITED);
879                         thread_unsuspend(p);
880                         PROC_SUNLOCK(p);
881                 }
882
883                 kern_psignal(p, SIGSTOP);
884                 break;
885
886         case PT_CLEARSTEP:
887                 CTR2(KTR_PTRACE, "PT_CLEARSTEP: tid %d (pid %d)", td2->td_tid,
888                     p->p_pid);
889                 error = ptrace_clear_single_step(td2);
890                 break;
891
892         case PT_SETSTEP:
893                 CTR2(KTR_PTRACE, "PT_SETSTEP: tid %d (pid %d)", td2->td_tid,
894                     p->p_pid);
895                 error = ptrace_single_step(td2);
896                 break;
897
898         case PT_SUSPEND:
899                 CTR2(KTR_PTRACE, "PT_SUSPEND: tid %d (pid %d)", td2->td_tid,
900                     p->p_pid);
901                 td2->td_dbgflags |= TDB_SUSPEND;
902                 thread_lock(td2);
903                 td2->td_flags |= TDF_NEEDSUSPCHK;
904                 thread_unlock(td2);
905                 break;
906
907         case PT_RESUME:
908                 CTR2(KTR_PTRACE, "PT_RESUME: tid %d (pid %d)", td2->td_tid,
909                     p->p_pid);
910                 td2->td_dbgflags &= ~TDB_SUSPEND;
911                 break;
912
913         case PT_FOLLOW_FORK:
914                 CTR3(KTR_PTRACE, "PT_FOLLOW_FORK: pid %d %s -> %s", p->p_pid,
915                     p->p_ptevents & PTRACE_FORK ? "enabled" : "disabled",
916                     data ? "enabled" : "disabled");
917                 if (data)
918                         p->p_ptevents |= PTRACE_FORK;
919                 else
920                         p->p_ptevents &= ~PTRACE_FORK;
921                 break;
922
923         case PT_LWP_EVENTS:
924                 CTR3(KTR_PTRACE, "PT_LWP_EVENTS: pid %d %s -> %s", p->p_pid,
925                     p->p_ptevents & PTRACE_LWP ? "enabled" : "disabled",
926                     data ? "enabled" : "disabled");
927                 if (data)
928                         p->p_ptevents |= PTRACE_LWP;
929                 else
930                         p->p_ptevents &= ~PTRACE_LWP;
931                 break;
932
933         case PT_GET_EVENT_MASK:
934                 if (data != sizeof(p->p_ptevents)) {
935                         error = EINVAL;
936                         break;
937                 }
938                 CTR2(KTR_PTRACE, "PT_GET_EVENT_MASK: pid %d mask %#x", p->p_pid,
939                     p->p_ptevents);
940                 *(int *)addr = p->p_ptevents;
941                 break;
942
943         case PT_SET_EVENT_MASK:
944                 if (data != sizeof(p->p_ptevents)) {
945                         error = EINVAL;
946                         break;
947                 }
948                 tmp = *(int *)addr;
949                 if ((tmp & ~(PTRACE_EXEC | PTRACE_SCE | PTRACE_SCX |
950                     PTRACE_FORK | PTRACE_LWP | PTRACE_VFORK)) != 0) {
951                         error = EINVAL;
952                         break;
953                 }
954                 CTR3(KTR_PTRACE, "PT_SET_EVENT_MASK: pid %d mask %#x -> %#x",
955                     p->p_pid, p->p_ptevents, tmp);
956                 p->p_ptevents = tmp;
957                 break;
958
959         case PT_GET_SC_ARGS:
960                 CTR1(KTR_PTRACE, "PT_GET_SC_ARGS: pid %d", p->p_pid);
961                 if ((td2->td_dbgflags & (TDB_SCE | TDB_SCX)) == 0
962 #ifdef COMPAT_FREEBSD32
963                     || (wrap32 && !safe)
964 #endif
965                     ) {
966                         error = EINVAL;
967                         break;
968                 }
969                 bzero(addr, sizeof(td2->td_sa.args));
970                 bcopy(td2->td_sa.args, addr, td2->td_sa.callp->sy_narg *
971                     sizeof(register_t));
972                 break;
973
974         case PT_GET_SC_RET:
975                 if ((td2->td_dbgflags & (TDB_SCX)) == 0
976 #ifdef COMPAT_FREEBSD32
977                     || (wrap32 && !safe)
978 #endif
979                     ) {
980                         error = EINVAL;
981                         break;
982                 }
983                 psr = addr;
984                 bzero(psr, sizeof(*psr));
985                 psr->sr_error = td2->td_errno;
986                 if (psr->sr_error == 0) {
987                         psr->sr_retval[0] = td2->td_retval[0];
988                         psr->sr_retval[1] = td2->td_retval[1];
989                 }
990                 CTR4(KTR_PTRACE,
991                     "PT_GET_SC_RET: pid %d error %d retval %#lx,%#lx",
992                     p->p_pid, psr->sr_error, psr->sr_retval[0],
993                     psr->sr_retval[1]);
994                 break;
995
996         case PT_STEP:
997         case PT_CONTINUE:
998         case PT_TO_SCE:
999         case PT_TO_SCX:
1000         case PT_SYSCALL:
1001         case PT_DETACH:
1002                 /* Zero means do not send any signal */
1003                 if (data < 0 || data > _SIG_MAXSIG) {
1004                         error = EINVAL;
1005                         break;
1006                 }
1007
1008                 switch (req) {
1009                 case PT_STEP:
1010                         CTR3(KTR_PTRACE, "PT_STEP: tid %d (pid %d), sig = %d",
1011                             td2->td_tid, p->p_pid, data);
1012                         error = ptrace_single_step(td2);
1013                         if (error)
1014                                 goto out;
1015                         break;
1016                 case PT_CONTINUE:
1017                 case PT_TO_SCE:
1018                 case PT_TO_SCX:
1019                 case PT_SYSCALL:
1020                         if (addr != (void *)1) {
1021                                 error = ptrace_set_pc(td2,
1022                                     (u_long)(uintfptr_t)addr);
1023                                 if (error)
1024                                         goto out;
1025                         }
1026                         switch (req) {
1027                         case PT_TO_SCE:
1028                                 p->p_ptevents |= PTRACE_SCE;
1029                                 CTR4(KTR_PTRACE,
1030                     "PT_TO_SCE: pid %d, events = %#x, PC = %#lx, sig = %d",
1031                                     p->p_pid, p->p_ptevents,
1032                                     (u_long)(uintfptr_t)addr, data);
1033                                 break;
1034                         case PT_TO_SCX:
1035                                 p->p_ptevents |= PTRACE_SCX;
1036                                 CTR4(KTR_PTRACE,
1037                     "PT_TO_SCX: pid %d, events = %#x, PC = %#lx, sig = %d",
1038                                     p->p_pid, p->p_ptevents,
1039                                     (u_long)(uintfptr_t)addr, data);
1040                                 break;
1041                         case PT_SYSCALL:
1042                                 p->p_ptevents |= PTRACE_SYSCALL;
1043                                 CTR4(KTR_PTRACE,
1044                     "PT_SYSCALL: pid %d, events = %#x, PC = %#lx, sig = %d",
1045                                     p->p_pid, p->p_ptevents,
1046                                     (u_long)(uintfptr_t)addr, data);
1047                                 break;
1048                         case PT_CONTINUE:
1049                                 CTR3(KTR_PTRACE,
1050                                     "PT_CONTINUE: pid %d, PC = %#lx, sig = %d",
1051                                     p->p_pid, (u_long)(uintfptr_t)addr, data);
1052                                 break;
1053                         }
1054                         break;
1055                 case PT_DETACH:
1056                         /*
1057                          * Clear P_TRACED before reparenting
1058                          * a detached process back to its original
1059                          * parent.  Otherwise the debugee will be set
1060                          * as an orphan of the debugger.
1061                          */
1062                         p->p_flag &= ~(P_TRACED | P_WAITED);
1063
1064                         /*
1065                          * Reset the process parent.
1066                          */
1067                         if (p->p_oppid != p->p_pptr->p_pid) {
1068                                 PROC_LOCK(p->p_pptr);
1069                                 sigqueue_take(p->p_ksi);
1070                                 PROC_UNLOCK(p->p_pptr);
1071
1072                                 pp = proc_realparent(p);
1073                                 proc_reparent(p, pp, false);
1074                                 if (pp == initproc)
1075                                         p->p_sigparent = SIGCHLD;
1076                                 CTR3(KTR_PTRACE,
1077                             "PT_DETACH: pid %d reparented to pid %d, sig %d",
1078                                     p->p_pid, pp->p_pid, data);
1079                         } else {
1080                                 CTR2(KTR_PTRACE, "PT_DETACH: pid %d, sig %d",
1081                                     p->p_pid, data);
1082                         }
1083
1084                         p->p_ptevents = 0;
1085                         FOREACH_THREAD_IN_PROC(p, td3) {
1086                                 if ((td3->td_dbgflags & TDB_FSTP) != 0) {
1087                                         sigqueue_delete(&td3->td_sigqueue,
1088                                             SIGSTOP);
1089                                 }
1090                                 td3->td_dbgflags &= ~(TDB_XSIG | TDB_FSTP |
1091                                     TDB_SUSPEND);
1092                         }
1093
1094                         if ((p->p_flag2 & P2_PTRACE_FSTP) != 0) {
1095                                 sigqueue_delete(&p->p_sigqueue, SIGSTOP);
1096                                 p->p_flag2 &= ~P2_PTRACE_FSTP;
1097                         }
1098
1099                         /* should we send SIGCHLD? */
1100                         /* childproc_continued(p); */
1101                         break;
1102                 }
1103
1104                 sx_xunlock(&proctree_lock);
1105                 proctree_locked = false;
1106
1107         sendsig:
1108                 MPASS(!proctree_locked);
1109
1110                 /*
1111                  * Clear the pending event for the thread that just
1112                  * reported its event (p_xthread).  This may not be
1113                  * the thread passed to PT_CONTINUE, PT_STEP, etc. if
1114                  * the debugger is resuming a different thread.
1115                  *
1116                  * Deliver any pending signal via the reporting thread.
1117                  */
1118                 MPASS(p->p_xthread != NULL);
1119                 p->p_xthread->td_dbgflags &= ~TDB_XSIG;
1120                 p->p_xthread->td_xsig = data;
1121                 p->p_xthread = NULL;
1122                 p->p_xsig = data;
1123
1124                 /*
1125                  * P_WKILLED is insurance that a PT_KILL/SIGKILL
1126                  * always works immediately, even if another thread is
1127                  * unsuspended first and attempts to handle a
1128                  * different signal or if the POSIX.1b style signal
1129                  * queue cannot accommodate any new signals.
1130                  */
1131                 if (data == SIGKILL)
1132                         proc_wkilled(p);
1133
1134                 /*
1135                  * Unsuspend all threads.  To leave a thread
1136                  * suspended, use PT_SUSPEND to suspend it before
1137                  * continuing the process.
1138                  */
1139                 PROC_SLOCK(p);
1140                 p->p_flag &= ~(P_STOPPED_TRACE | P_STOPPED_SIG | P_WAITED);
1141                 thread_unsuspend(p);
1142                 PROC_SUNLOCK(p);
1143                 itimer_proc_continue(p);
1144                 kqtimer_proc_continue(p);
1145                 break;
1146
1147         case PT_WRITE_I:
1148         case PT_WRITE_D:
1149                 td2->td_dbgflags |= TDB_USERWR;
1150                 PROC_UNLOCK(p);
1151                 error = 0;
1152                 if (proc_writemem(td, p, (off_t)(uintptr_t)addr, &data,
1153                     sizeof(int)) != sizeof(int))
1154                         error = ENOMEM;
1155                 else
1156                         CTR3(KTR_PTRACE, "PT_WRITE: pid %d: %p <= %#x",
1157                             p->p_pid, addr, data);
1158                 PROC_LOCK(p);
1159                 break;
1160
1161         case PT_READ_I:
1162         case PT_READ_D:
1163                 PROC_UNLOCK(p);
1164                 error = tmp = 0;
1165                 if (proc_readmem(td, p, (off_t)(uintptr_t)addr, &tmp,
1166                     sizeof(int)) != sizeof(int))
1167                         error = ENOMEM;
1168                 else
1169                         CTR3(KTR_PTRACE, "PT_READ: pid %d: %p >= %#x",
1170                             p->p_pid, addr, tmp);
1171                 td->td_retval[0] = tmp;
1172                 PROC_LOCK(p);
1173                 break;
1174
1175         case PT_IO:
1176                 piod = addr;
1177                 iov.iov_base = piod->piod_addr;
1178                 iov.iov_len = piod->piod_len;
1179                 uio.uio_offset = (off_t)(uintptr_t)piod->piod_offs;
1180                 uio.uio_resid = piod->piod_len;
1181                 uio.uio_iov = &iov;
1182                 uio.uio_iovcnt = 1;
1183                 uio.uio_segflg = UIO_USERSPACE;
1184                 uio.uio_td = td;
1185                 switch (piod->piod_op) {
1186                 case PIOD_READ_D:
1187                 case PIOD_READ_I:
1188                         CTR3(KTR_PTRACE, "PT_IO: pid %d: READ (%p, %#x)",
1189                             p->p_pid, (uintptr_t)uio.uio_offset, uio.uio_resid);
1190                         uio.uio_rw = UIO_READ;
1191                         break;
1192                 case PIOD_WRITE_D:
1193                 case PIOD_WRITE_I:
1194                         CTR3(KTR_PTRACE, "PT_IO: pid %d: WRITE (%p, %#x)",
1195                             p->p_pid, (uintptr_t)uio.uio_offset, uio.uio_resid);
1196                         td2->td_dbgflags |= TDB_USERWR;
1197                         uio.uio_rw = UIO_WRITE;
1198                         break;
1199                 default:
1200                         error = EINVAL;
1201                         goto out;
1202                 }
1203                 PROC_UNLOCK(p);
1204                 error = proc_rwmem(p, &uio);
1205                 piod->piod_len -= uio.uio_resid;
1206                 PROC_LOCK(p);
1207                 break;
1208
1209         case PT_KILL:
1210                 CTR1(KTR_PTRACE, "PT_KILL: pid %d", p->p_pid);
1211                 data = SIGKILL;
1212                 goto sendsig;   /* in PT_CONTINUE above */
1213
1214         case PT_SETREGS:
1215                 CTR2(KTR_PTRACE, "PT_SETREGS: tid %d (pid %d)", td2->td_tid,
1216                     p->p_pid);
1217                 td2->td_dbgflags |= TDB_USERWR;
1218                 error = PROC_WRITE(regs, td2, addr);
1219                 break;
1220
1221         case PT_GETREGS:
1222                 CTR2(KTR_PTRACE, "PT_GETREGS: tid %d (pid %d)", td2->td_tid,
1223                     p->p_pid);
1224                 error = PROC_READ(regs, td2, addr);
1225                 break;
1226
1227         case PT_SETFPREGS:
1228                 CTR2(KTR_PTRACE, "PT_SETFPREGS: tid %d (pid %d)", td2->td_tid,
1229                     p->p_pid);
1230                 td2->td_dbgflags |= TDB_USERWR;
1231                 error = PROC_WRITE(fpregs, td2, addr);
1232                 break;
1233
1234         case PT_GETFPREGS:
1235                 CTR2(KTR_PTRACE, "PT_GETFPREGS: tid %d (pid %d)", td2->td_tid,
1236                     p->p_pid);
1237                 error = PROC_READ(fpregs, td2, addr);
1238                 break;
1239
1240         case PT_SETDBREGS:
1241                 CTR2(KTR_PTRACE, "PT_SETDBREGS: tid %d (pid %d)", td2->td_tid,
1242                     p->p_pid);
1243                 td2->td_dbgflags |= TDB_USERWR;
1244                 error = PROC_WRITE(dbregs, td2, addr);
1245                 break;
1246
1247         case PT_GETDBREGS:
1248                 CTR2(KTR_PTRACE, "PT_GETDBREGS: tid %d (pid %d)", td2->td_tid,
1249                     p->p_pid);
1250                 error = PROC_READ(dbregs, td2, addr);
1251                 break;
1252
1253         case PT_LWPINFO:
1254                 if (data <= 0 || data > sizeof(*pl)) {
1255                         error = EINVAL;
1256                         break;
1257                 }
1258                 pl = addr;
1259                 bzero(pl, sizeof(*pl));
1260                 pl->pl_lwpid = td2->td_tid;
1261                 pl->pl_event = PL_EVENT_NONE;
1262                 pl->pl_flags = 0;
1263                 if (td2->td_dbgflags & TDB_XSIG) {
1264                         pl->pl_event = PL_EVENT_SIGNAL;
1265                         if (td2->td_si.si_signo != 0 &&
1266                             data >= offsetof(struct ptrace_lwpinfo, pl_siginfo)
1267                             + sizeof(pl->pl_siginfo)){
1268                                 pl->pl_flags |= PL_FLAG_SI;
1269                                 pl->pl_siginfo = td2->td_si;
1270                         }
1271                 }
1272                 if (td2->td_dbgflags & TDB_SCE)
1273                         pl->pl_flags |= PL_FLAG_SCE;
1274                 else if (td2->td_dbgflags & TDB_SCX)
1275                         pl->pl_flags |= PL_FLAG_SCX;
1276                 if (td2->td_dbgflags & TDB_EXEC)
1277                         pl->pl_flags |= PL_FLAG_EXEC;
1278                 if (td2->td_dbgflags & TDB_FORK) {
1279                         pl->pl_flags |= PL_FLAG_FORKED;
1280                         pl->pl_child_pid = td2->td_dbg_forked;
1281                         if (td2->td_dbgflags & TDB_VFORK)
1282                                 pl->pl_flags |= PL_FLAG_VFORKED;
1283                 } else if ((td2->td_dbgflags & (TDB_SCX | TDB_VFORK)) ==
1284                     TDB_VFORK)
1285                         pl->pl_flags |= PL_FLAG_VFORK_DONE;
1286                 if (td2->td_dbgflags & TDB_CHILD)
1287                         pl->pl_flags |= PL_FLAG_CHILD;
1288                 if (td2->td_dbgflags & TDB_BORN)
1289                         pl->pl_flags |= PL_FLAG_BORN;
1290                 if (td2->td_dbgflags & TDB_EXIT)
1291                         pl->pl_flags |= PL_FLAG_EXITED;
1292                 pl->pl_sigmask = td2->td_sigmask;
1293                 pl->pl_siglist = td2->td_siglist;
1294                 strcpy(pl->pl_tdname, td2->td_name);
1295                 if ((td2->td_dbgflags & (TDB_SCE | TDB_SCX)) != 0) {
1296                         pl->pl_syscall_code = td2->td_sa.code;
1297                         pl->pl_syscall_narg = td2->td_sa.callp->sy_narg;
1298                 } else {
1299                         pl->pl_syscall_code = 0;
1300                         pl->pl_syscall_narg = 0;
1301                 }
1302                 CTR6(KTR_PTRACE,
1303     "PT_LWPINFO: tid %d (pid %d) event %d flags %#x child pid %d syscall %d",
1304                     td2->td_tid, p->p_pid, pl->pl_event, pl->pl_flags,
1305                     pl->pl_child_pid, pl->pl_syscall_code);
1306                 break;
1307
1308         case PT_GETNUMLWPS:
1309                 CTR2(KTR_PTRACE, "PT_GETNUMLWPS: pid %d: %d threads", p->p_pid,
1310                     p->p_numthreads);
1311                 td->td_retval[0] = p->p_numthreads;
1312                 break;
1313
1314         case PT_GETLWPLIST:
1315                 CTR3(KTR_PTRACE, "PT_GETLWPLIST: pid %d: data %d, actual %d",
1316                     p->p_pid, data, p->p_numthreads);
1317                 if (data <= 0) {
1318                         error = EINVAL;
1319                         break;
1320                 }
1321                 num = imin(p->p_numthreads, data);
1322                 PROC_UNLOCK(p);
1323                 buf = malloc(num * sizeof(lwpid_t), M_TEMP, M_WAITOK);
1324                 tmp = 0;
1325                 PROC_LOCK(p);
1326                 FOREACH_THREAD_IN_PROC(p, td2) {
1327                         if (tmp >= num)
1328                                 break;
1329                         buf[tmp++] = td2->td_tid;
1330                 }
1331                 PROC_UNLOCK(p);
1332                 error = copyout(buf, addr, tmp * sizeof(lwpid_t));
1333                 free(buf, M_TEMP);
1334                 if (!error)
1335                         td->td_retval[0] = tmp;
1336                 PROC_LOCK(p);
1337                 break;
1338
1339         case PT_VM_TIMESTAMP:
1340                 CTR2(KTR_PTRACE, "PT_VM_TIMESTAMP: pid %d: timestamp %d",
1341                     p->p_pid, p->p_vmspace->vm_map.timestamp);
1342                 td->td_retval[0] = p->p_vmspace->vm_map.timestamp;
1343                 break;
1344
1345         case PT_VM_ENTRY:
1346                 PROC_UNLOCK(p);
1347                 error = ptrace_vm_entry(td, p, addr);
1348                 PROC_LOCK(p);
1349                 break;
1350
1351         default:
1352 #ifdef __HAVE_PTRACE_MACHDEP
1353                 if (req >= PT_FIRSTMACH) {
1354                         PROC_UNLOCK(p);
1355                         error = cpu_ptrace(td2, req, addr, data);
1356                         PROC_LOCK(p);
1357                 } else
1358 #endif
1359                         /* Unknown request. */
1360                         error = EINVAL;
1361                 break;
1362         }
1363
1364 out:
1365         /* Drop our hold on this process now that the request has completed. */
1366         _PRELE(p);
1367 fail:
1368         if (p2_req_set) {
1369                 if ((p->p_flag2 & P2_PTRACEREQ) != 0)
1370                         wakeup(&p->p_flag2);
1371                 p->p_flag2 &= ~P2_PTRACEREQ;
1372         }
1373         PROC_UNLOCK(p);
1374         if (proctree_locked)
1375                 sx_xunlock(&proctree_lock);
1376         return (error);
1377 }
1378 #undef PROC_READ
1379 #undef PROC_WRITE