1 /*- 2 * Copyright (c) 1982, 1986, 1989, 1991, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 4. Neither the name of the University nor the names of its contributors 14 * may be used to endorse or promote products derived from this software 15 * without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * @(#)kern_proc.c 8.7 (Berkeley) 2/14/95 30 */ 31 32 #include <sys/cdefs.h> 33 __FBSDID("$FreeBSD$"); 34 35 #include "opt_ktrace.h" 36 #include "opt_kstack_pages.h" 37 38 #include <sys/param.h> 39 #include <sys/systm.h> 40 #include <sys/kernel.h> 41 #include <sys/lock.h> 42 #include <sys/malloc.h> 43 #include <sys/mutex.h> 44 #include <sys/proc.h> 45 #include <sys/refcount.h> 46 #include <sys/sysent.h> 47 #include <sys/sched.h> 48 #include <sys/smp.h> 49 #include <sys/sysctl.h> 50 #include <sys/filedesc.h> 51 #include <sys/tty.h> 52 #include <sys/signalvar.h> 53 #include <sys/sx.h> 54 #include <sys/user.h> 55 #include <sys/jail.h> 56 #include <sys/vnode.h> 57 #ifdef KTRACE 58 #include <sys/uio.h> 59 #include <sys/ktrace.h> 60 #endif 61 62 #include <vm/vm.h> 63 #include <vm/vm_extern.h> 64 #include <vm/pmap.h> 65 #include <vm/vm_map.h> 66 #include <vm/uma.h> 67 68 MALLOC_DEFINE(M_PGRP, "pgrp", "process group header"); 69 MALLOC_DEFINE(M_SESSION, "session", "session header"); 70 static MALLOC_DEFINE(M_PROC, "proc", "Proc structures"); 71 MALLOC_DEFINE(M_SUBPROC, "subproc", "Proc sub-structures"); 72 73 static void doenterpgrp(struct proc *, struct pgrp *); 74 static void orphanpg(struct pgrp *pg); 75 static void fill_kinfo_proc_only(struct proc *p, struct kinfo_proc *kp); 76 static void fill_kinfo_thread(struct thread *td, struct kinfo_proc *kp); 77 static void pgadjustjobc(struct pgrp *pgrp, int entering); 78 static void pgdelete(struct pgrp *); 79 static int proc_ctor(void *mem, int size, void *arg, int flags); 80 static void proc_dtor(void *mem, int size, void *arg); 81 static int proc_init(void *mem, int size, int flags); 82 static void proc_fini(void *mem, int size); 83 84 /* 85 * Other process lists 86 */ 87 struct pidhashhead *pidhashtbl; 88 u_long pidhash; 89 struct pgrphashhead *pgrphashtbl; 90 u_long pgrphash; 91 struct proclist allproc; 92 struct proclist zombproc; 93 struct sx allproc_lock; 94 struct sx proctree_lock; 95 struct mtx ppeers_lock; 96 uma_zone_t proc_zone; 97 uma_zone_t ithread_zone; 98 99 int kstack_pages = KSTACK_PAGES; 100 SYSCTL_INT(_kern, OID_AUTO, kstack_pages, CTLFLAG_RD, &kstack_pages, 0, ""); 101 102 CTASSERT(sizeof(struct kinfo_proc) == KINFO_PROC_SIZE); 103 104 /* 105 * Initialize global process hashing structures. 106 */ 107 void 108 procinit() 109 { 110 111 sx_init(&allproc_lock, "allproc"); 112 sx_init(&proctree_lock, "proctree"); 113 mtx_init(&ppeers_lock, "p_peers", NULL, MTX_DEF); 114 LIST_INIT(&allproc); 115 LIST_INIT(&zombproc); 116 pidhashtbl = hashinit(maxproc / 4, M_PROC, &pidhash); 117 pgrphashtbl = hashinit(maxproc / 4, M_PROC, &pgrphash); 118 proc_zone = uma_zcreate("PROC", sched_sizeof_proc(), 119 proc_ctor, proc_dtor, proc_init, proc_fini, 120 UMA_ALIGN_PTR, UMA_ZONE_NOFREE); 121 uihashinit(); 122 } 123 124 /* 125 * Prepare a proc for use. 126 */ 127 static int 128 proc_ctor(void *mem, int size, void *arg, int flags) 129 { 130 struct proc *p; 131 132 p = (struct proc *)mem; 133 return (0); 134 } 135 136 /* 137 * Reclaim a proc after use. 138 */ 139 static void 140 proc_dtor(void *mem, int size, void *arg) 141 { 142 struct proc *p; 143 struct thread *td; 144 145 /* INVARIANTS checks go here */ 146 p = (struct proc *)mem; 147 td = FIRST_THREAD_IN_PROC(p); 148 #ifdef INVARIANTS 149 KASSERT((p->p_numthreads == 1), 150 ("bad number of threads in exiting process")); 151 KASSERT((td != NULL), ("proc_dtor: bad thread pointer")); 152 KASSERT(STAILQ_EMPTY(&p->p_ktr), ("proc_dtor: non-empty p_ktr")); 153 #endif 154 155 /* Dispose of an alternate kstack, if it exists. 156 * XXX What if there are more than one thread in the proc? 157 * The first thread in the proc is special and not 158 * freed, so you gotta do this here. 159 */ 160 if (((p->p_flag & P_KTHREAD) != 0) && (td->td_altkstack != 0)) 161 vm_thread_dispose_altkstack(td); 162 if (p->p_ksi != NULL) 163 KASSERT(! KSI_ONQ(p->p_ksi), ("SIGCHLD queue")); 164 } 165 166 /* 167 * Initialize type-stable parts of a proc (when newly created). 168 */ 169 static int 170 proc_init(void *mem, int size, int flags) 171 { 172 struct proc *p; 173 struct thread *td; 174 175 p = (struct proc *)mem; 176 p->p_sched = (struct p_sched *)&p[1]; 177 td = thread_alloc(); 178 bzero(&p->p_mtx, sizeof(struct mtx)); 179 mtx_init(&p->p_mtx, "process lock", NULL, MTX_DEF | MTX_DUPOK); 180 mtx_init(&p->p_slock, "process slock", NULL, MTX_SPIN | MTX_RECURSE); 181 p->p_stats = pstats_alloc(); 182 proc_linkup(p, td); 183 sched_newproc(p, td); 184 return (0); 185 } 186 187 /* 188 * UMA should ensure that this function is never called. 189 * Freeing a proc structure would violate type stability. 190 */ 191 static void 192 proc_fini(void *mem, int size) 193 { 194 #ifdef notnow 195 struct proc *p; 196 197 p = (struct proc *)mem; 198 pstats_free(p->p_stats); 199 thread_free(FIRST_THREAD_IN_PROC(p)); 200 mtx_destroy(&p->p_mtx); 201 if (p->p_ksi != NULL) 202 ksiginfo_free(p->p_ksi); 203 #else 204 panic("proc reclaimed"); 205 #endif 206 } 207 208 /* 209 * Is p an inferior of the current process? 210 */ 211 int 212 inferior(p) 213 register struct proc *p; 214 { 215 216 sx_assert(&proctree_lock, SX_LOCKED); 217 for (; p != curproc; p = p->p_pptr) 218 if (p->p_pid == 0) 219 return (0); 220 return (1); 221 } 222 223 /* 224 * Locate a process by number; return only "live" processes -- i.e., neither 225 * zombies nor newly born but incompletely initialized processes. By not 226 * returning processes in the PRS_NEW state, we allow callers to avoid 227 * testing for that condition to avoid dereferencing p_ucred, et al. 228 */ 229 struct proc * 230 pfind(pid) 231 register pid_t pid; 232 { 233 register struct proc *p; 234 235 sx_slock(&allproc_lock); 236 LIST_FOREACH(p, PIDHASH(pid), p_hash) 237 if (p->p_pid == pid) { 238 if (p->p_state == PRS_NEW) { 239 p = NULL; 240 break; 241 } 242 PROC_LOCK(p); 243 break; 244 } 245 sx_sunlock(&allproc_lock); 246 return (p); 247 } 248 249 /* 250 * Locate a process group by number. 251 * The caller must hold proctree_lock. 252 */ 253 struct pgrp * 254 pgfind(pgid) 255 register pid_t pgid; 256 { 257 register struct pgrp *pgrp; 258 259 sx_assert(&proctree_lock, SX_LOCKED); 260 261 LIST_FOREACH(pgrp, PGRPHASH(pgid), pg_hash) { 262 if (pgrp->pg_id == pgid) { 263 PGRP_LOCK(pgrp); 264 return (pgrp); 265 } 266 } 267 return (NULL); 268 } 269 270 /* 271 * Create a new process group. 272 * pgid must be equal to the pid of p. 273 * Begin a new session if required. 274 */ 275 int 276 enterpgrp(p, pgid, pgrp, sess) 277 register struct proc *p; 278 pid_t pgid; 279 struct pgrp *pgrp; 280 struct session *sess; 281 { 282 struct pgrp *pgrp2; 283 284 sx_assert(&proctree_lock, SX_XLOCKED); 285 286 KASSERT(pgrp != NULL, ("enterpgrp: pgrp == NULL")); 287 KASSERT(p->p_pid == pgid, 288 ("enterpgrp: new pgrp and pid != pgid")); 289 290 pgrp2 = pgfind(pgid); 291 292 KASSERT(pgrp2 == NULL, 293 ("enterpgrp: pgrp with pgid exists")); 294 KASSERT(!SESS_LEADER(p), 295 ("enterpgrp: session leader attempted setpgrp")); 296 297 mtx_init(&pgrp->pg_mtx, "process group", NULL, MTX_DEF | MTX_DUPOK); 298 299 if (sess != NULL) { 300 /* 301 * new session 302 */ 303 mtx_init(&sess->s_mtx, "session", NULL, MTX_DEF); 304 mtx_lock(&Giant); /* XXX TTY */ 305 PROC_LOCK(p); 306 p->p_flag &= ~P_CONTROLT; 307 PROC_UNLOCK(p); 308 PGRP_LOCK(pgrp); 309 sess->s_leader = p; 310 sess->s_sid = p->p_pid; 311 sess->s_count = 1; 312 sess->s_ttyvp = NULL; 313 sess->s_ttyp = NULL; 314 bcopy(p->p_session->s_login, sess->s_login, 315 sizeof(sess->s_login)); 316 pgrp->pg_session = sess; 317 KASSERT(p == curproc, 318 ("enterpgrp: mksession and p != curproc")); 319 } else { 320 mtx_lock(&Giant); /* XXX TTY */ 321 pgrp->pg_session = p->p_session; 322 SESS_LOCK(pgrp->pg_session); 323 pgrp->pg_session->s_count++; 324 SESS_UNLOCK(pgrp->pg_session); 325 PGRP_LOCK(pgrp); 326 } 327 pgrp->pg_id = pgid; 328 LIST_INIT(&pgrp->pg_members); 329 330 /* 331 * As we have an exclusive lock of proctree_lock, 332 * this should not deadlock. 333 */ 334 LIST_INSERT_HEAD(PGRPHASH(pgid), pgrp, pg_hash); 335 pgrp->pg_jobc = 0; 336 SLIST_INIT(&pgrp->pg_sigiolst); 337 PGRP_UNLOCK(pgrp); 338 mtx_unlock(&Giant); /* XXX TTY */ 339 340 doenterpgrp(p, pgrp); 341 342 return (0); 343 } 344 345 /* 346 * Move p to an existing process group 347 */ 348 int 349 enterthispgrp(p, pgrp) 350 register struct proc *p; 351 struct pgrp *pgrp; 352 { 353 354 sx_assert(&proctree_lock, SX_XLOCKED); 355 PROC_LOCK_ASSERT(p, MA_NOTOWNED); 356 PGRP_LOCK_ASSERT(pgrp, MA_NOTOWNED); 357 PGRP_LOCK_ASSERT(p->p_pgrp, MA_NOTOWNED); 358 SESS_LOCK_ASSERT(p->p_session, MA_NOTOWNED); 359 KASSERT(pgrp->pg_session == p->p_session, 360 ("%s: pgrp's session %p, p->p_session %p.\n", 361 __func__, 362 pgrp->pg_session, 363 p->p_session)); 364 KASSERT(pgrp != p->p_pgrp, 365 ("%s: p belongs to pgrp.", __func__)); 366 367 doenterpgrp(p, pgrp); 368 369 return (0); 370 } 371 372 /* 373 * Move p to a process group 374 */ 375 static void 376 doenterpgrp(p, pgrp) 377 struct proc *p; 378 struct pgrp *pgrp; 379 { 380 struct pgrp *savepgrp; 381 382 sx_assert(&proctree_lock, SX_XLOCKED); 383 PROC_LOCK_ASSERT(p, MA_NOTOWNED); 384 PGRP_LOCK_ASSERT(pgrp, MA_NOTOWNED); 385 PGRP_LOCK_ASSERT(p->p_pgrp, MA_NOTOWNED); 386 SESS_LOCK_ASSERT(p->p_session, MA_NOTOWNED); 387 388 savepgrp = p->p_pgrp; 389 390 /* 391 * Adjust eligibility of affected pgrps to participate in job control. 392 * Increment eligibility counts before decrementing, otherwise we 393 * could reach 0 spuriously during the first call. 394 */ 395 fixjobc(p, pgrp, 1); 396 fixjobc(p, p->p_pgrp, 0); 397 398 mtx_lock(&Giant); /* XXX TTY */ 399 PGRP_LOCK(pgrp); 400 PGRP_LOCK(savepgrp); 401 PROC_LOCK(p); 402 LIST_REMOVE(p, p_pglist); 403 p->p_pgrp = pgrp; 404 PROC_UNLOCK(p); 405 LIST_INSERT_HEAD(&pgrp->pg_members, p, p_pglist); 406 PGRP_UNLOCK(savepgrp); 407 PGRP_UNLOCK(pgrp); 408 mtx_unlock(&Giant); /* XXX TTY */ 409 if (LIST_EMPTY(&savepgrp->pg_members)) 410 pgdelete(savepgrp); 411 } 412 413 /* 414 * remove process from process group 415 */ 416 int 417 leavepgrp(p) 418 register struct proc *p; 419 { 420 struct pgrp *savepgrp; 421 422 sx_assert(&proctree_lock, SX_XLOCKED); 423 savepgrp = p->p_pgrp; 424 mtx_lock(&Giant); /* XXX TTY */ 425 PGRP_LOCK(savepgrp); 426 PROC_LOCK(p); 427 LIST_REMOVE(p, p_pglist); 428 p->p_pgrp = NULL; 429 PROC_UNLOCK(p); 430 PGRP_UNLOCK(savepgrp); 431 mtx_unlock(&Giant); /* XXX TTY */ 432 if (LIST_EMPTY(&savepgrp->pg_members)) 433 pgdelete(savepgrp); 434 return (0); 435 } 436 437 /* 438 * delete a process group 439 */ 440 static void 441 pgdelete(pgrp) 442 register struct pgrp *pgrp; 443 { 444 struct session *savesess; 445 446 sx_assert(&proctree_lock, SX_XLOCKED); 447 PGRP_LOCK_ASSERT(pgrp, MA_NOTOWNED); 448 SESS_LOCK_ASSERT(pgrp->pg_session, MA_NOTOWNED); 449 450 /* 451 * Reset any sigio structures pointing to us as a result of 452 * F_SETOWN with our pgid. 453 */ 454 funsetownlst(&pgrp->pg_sigiolst); 455 456 mtx_lock(&Giant); /* XXX TTY */ 457 PGRP_LOCK(pgrp); 458 if (pgrp->pg_session->s_ttyp != NULL && 459 pgrp->pg_session->s_ttyp->t_pgrp == pgrp) 460 pgrp->pg_session->s_ttyp->t_pgrp = NULL; 461 LIST_REMOVE(pgrp, pg_hash); 462 savesess = pgrp->pg_session; 463 SESSRELE(savesess); 464 PGRP_UNLOCK(pgrp); 465 mtx_destroy(&pgrp->pg_mtx); 466 FREE(pgrp, M_PGRP); 467 mtx_unlock(&Giant); /* XXX TTY */ 468 } 469 470 static void 471 pgadjustjobc(pgrp, entering) 472 struct pgrp *pgrp; 473 int entering; 474 { 475 476 PGRP_LOCK(pgrp); 477 if (entering) 478 pgrp->pg_jobc++; 479 else { 480 --pgrp->pg_jobc; 481 if (pgrp->pg_jobc == 0) 482 orphanpg(pgrp); 483 } 484 PGRP_UNLOCK(pgrp); 485 } 486 487 /* 488 * Adjust pgrp jobc counters when specified process changes process group. 489 * We count the number of processes in each process group that "qualify" 490 * the group for terminal job control (those with a parent in a different 491 * process group of the same session). If that count reaches zero, the 492 * process group becomes orphaned. Check both the specified process' 493 * process group and that of its children. 494 * entering == 0 => p is leaving specified group. 495 * entering == 1 => p is entering specified group. 496 */ 497 void 498 fixjobc(p, pgrp, entering) 499 register struct proc *p; 500 register struct pgrp *pgrp; 501 int entering; 502 { 503 register struct pgrp *hispgrp; 504 register struct session *mysession; 505 506 sx_assert(&proctree_lock, SX_LOCKED); 507 PROC_LOCK_ASSERT(p, MA_NOTOWNED); 508 PGRP_LOCK_ASSERT(pgrp, MA_NOTOWNED); 509 SESS_LOCK_ASSERT(pgrp->pg_session, MA_NOTOWNED); 510 511 /* 512 * Check p's parent to see whether p qualifies its own process 513 * group; if so, adjust count for p's process group. 514 */ 515 mysession = pgrp->pg_session; 516 if ((hispgrp = p->p_pptr->p_pgrp) != pgrp && 517 hispgrp->pg_session == mysession) 518 pgadjustjobc(pgrp, entering); 519 520 /* 521 * Check this process' children to see whether they qualify 522 * their process groups; if so, adjust counts for children's 523 * process groups. 524 */ 525 LIST_FOREACH(p, &p->p_children, p_sibling) { 526 hispgrp = p->p_pgrp; 527 if (hispgrp == pgrp || 528 hispgrp->pg_session != mysession) 529 continue; 530 PROC_LOCK(p); 531 if (p->p_state == PRS_ZOMBIE) { 532 PROC_UNLOCK(p); 533 continue; 534 } 535 PROC_UNLOCK(p); 536 pgadjustjobc(hispgrp, entering); 537 } 538 } 539 540 /* 541 * A process group has become orphaned; 542 * if there are any stopped processes in the group, 543 * hang-up all process in that group. 544 */ 545 static void 546 orphanpg(pg) 547 struct pgrp *pg; 548 { 549 register struct proc *p; 550 551 PGRP_LOCK_ASSERT(pg, MA_OWNED); 552 553 LIST_FOREACH(p, &pg->pg_members, p_pglist) { 554 PROC_LOCK(p); 555 if (P_SHOULDSTOP(p)) { 556 PROC_UNLOCK(p); 557 LIST_FOREACH(p, &pg->pg_members, p_pglist) { 558 PROC_LOCK(p); 559 psignal(p, SIGHUP); 560 psignal(p, SIGCONT); 561 PROC_UNLOCK(p); 562 } 563 return; 564 } 565 PROC_UNLOCK(p); 566 } 567 } 568 569 void 570 sessrele(struct session *s) 571 { 572 int i; 573 574 SESS_LOCK(s); 575 i = --s->s_count; 576 SESS_UNLOCK(s); 577 if (i == 0) { 578 if (s->s_ttyp != NULL) 579 ttyrel(s->s_ttyp); 580 mtx_destroy(&s->s_mtx); 581 FREE(s, M_SESSION); 582 } 583 } 584 585 #include "opt_ddb.h" 586 #ifdef DDB 587 #include <ddb/ddb.h> 588 589 DB_SHOW_COMMAND(pgrpdump, pgrpdump) 590 { 591 register struct pgrp *pgrp; 592 register struct proc *p; 593 register int i; 594 595 for (i = 0; i <= pgrphash; i++) { 596 if (!LIST_EMPTY(&pgrphashtbl[i])) { 597 printf("\tindx %d\n", i); 598 LIST_FOREACH(pgrp, &pgrphashtbl[i], pg_hash) { 599 printf( 600 "\tpgrp %p, pgid %ld, sess %p, sesscnt %d, mem %p\n", 601 (void *)pgrp, (long)pgrp->pg_id, 602 (void *)pgrp->pg_session, 603 pgrp->pg_session->s_count, 604 (void *)LIST_FIRST(&pgrp->pg_members)); 605 LIST_FOREACH(p, &pgrp->pg_members, p_pglist) { 606 printf("\t\tpid %ld addr %p pgrp %p\n", 607 (long)p->p_pid, (void *)p, 608 (void *)p->p_pgrp); 609 } 610 } 611 } 612 } 613 } 614 #endif /* DDB */ 615 616 /* 617 * Clear kinfo_proc and fill in any information that is common 618 * to all threads in the process. 619 * Must be called with the target process locked. 620 */ 621 static void 622 fill_kinfo_proc_only(struct proc *p, struct kinfo_proc *kp) 623 { 624 struct thread *td0; 625 struct tty *tp; 626 struct session *sp; 627 struct ucred *cred; 628 struct sigacts *ps; 629 630 bzero(kp, sizeof(*kp)); 631 632 kp->ki_structsize = sizeof(*kp); 633 kp->ki_paddr = p; 634 PROC_LOCK_ASSERT(p, MA_OWNED); 635 kp->ki_addr =/* p->p_addr; */0; /* XXXKSE */ 636 kp->ki_args = p->p_args; 637 kp->ki_textvp = p->p_textvp; 638 #ifdef KTRACE 639 kp->ki_tracep = p->p_tracevp; 640 mtx_lock(&ktrace_mtx); 641 kp->ki_traceflag = p->p_traceflag; 642 mtx_unlock(&ktrace_mtx); 643 #endif 644 kp->ki_fd = p->p_fd; 645 kp->ki_vmspace = p->p_vmspace; 646 kp->ki_flag = p->p_flag; 647 cred = p->p_ucred; 648 if (cred) { 649 kp->ki_uid = cred->cr_uid; 650 kp->ki_ruid = cred->cr_ruid; 651 kp->ki_svuid = cred->cr_svuid; 652 /* XXX bde doesn't like KI_NGROUPS */ 653 kp->ki_ngroups = min(cred->cr_ngroups, KI_NGROUPS); 654 bcopy(cred->cr_groups, kp->ki_groups, 655 kp->ki_ngroups * sizeof(gid_t)); 656 kp->ki_rgid = cred->cr_rgid; 657 kp->ki_svgid = cred->cr_svgid; 658 /* If jailed(cred), emulate the old P_JAILED flag. */ 659 if (jailed(cred)) { 660 kp->ki_flag |= P_JAILED; 661 /* If inside a jail, use 0 as a jail ID. */ 662 if (!jailed(curthread->td_ucred)) 663 kp->ki_jid = cred->cr_prison->pr_id; 664 } 665 } 666 ps = p->p_sigacts; 667 if (ps) { 668 mtx_lock(&ps->ps_mtx); 669 kp->ki_sigignore = ps->ps_sigignore; 670 kp->ki_sigcatch = ps->ps_sigcatch; 671 mtx_unlock(&ps->ps_mtx); 672 } 673 PROC_SLOCK(p); 674 if (p->p_state != PRS_NEW && 675 p->p_state != PRS_ZOMBIE && 676 p->p_vmspace != NULL) { 677 struct vmspace *vm = p->p_vmspace; 678 679 kp->ki_size = vm->vm_map.size; 680 kp->ki_rssize = vmspace_resident_count(vm); /*XXX*/ 681 FOREACH_THREAD_IN_PROC(p, td0) { 682 if (!TD_IS_SWAPPED(td0)) 683 kp->ki_rssize += td0->td_kstack_pages; 684 if (td0->td_altkstack_obj != NULL) 685 kp->ki_rssize += td0->td_altkstack_pages; 686 } 687 kp->ki_swrss = vm->vm_swrss; 688 kp->ki_tsize = vm->vm_tsize; 689 kp->ki_dsize = vm->vm_dsize; 690 kp->ki_ssize = vm->vm_ssize; 691 } else if (p->p_state == PRS_ZOMBIE) 692 kp->ki_stat = SZOMB; 693 kp->ki_sflag = p->p_sflag; 694 kp->ki_swtime = p->p_swtime; 695 kp->ki_pid = p->p_pid; 696 kp->ki_nice = p->p_nice; 697 rufetch(p, &kp->ki_rusage); 698 kp->ki_runtime = cputick2usec(p->p_rux.rux_runtime); 699 PROC_SUNLOCK(p); 700 if ((p->p_sflag & PS_INMEM) && p->p_stats != NULL) { 701 kp->ki_start = p->p_stats->p_start; 702 timevaladd(&kp->ki_start, &boottime); 703 PROC_SLOCK(p); 704 calcru(p, &kp->ki_rusage.ru_utime, &kp->ki_rusage.ru_stime); 705 PROC_SUNLOCK(p); 706 calccru(p, &kp->ki_childutime, &kp->ki_childstime); 707 708 /* Some callers want child-times in a single value */ 709 kp->ki_childtime = kp->ki_childstime; 710 timevaladd(&kp->ki_childtime, &kp->ki_childutime); 711 } 712 tp = NULL; 713 if (p->p_pgrp) { 714 kp->ki_pgid = p->p_pgrp->pg_id; 715 kp->ki_jobc = p->p_pgrp->pg_jobc; 716 sp = p->p_pgrp->pg_session; 717 718 if (sp != NULL) { 719 kp->ki_sid = sp->s_sid; 720 SESS_LOCK(sp); 721 strlcpy(kp->ki_login, sp->s_login, 722 sizeof(kp->ki_login)); 723 if (sp->s_ttyvp) 724 kp->ki_kiflag |= KI_CTTY; 725 if (SESS_LEADER(p)) 726 kp->ki_kiflag |= KI_SLEADER; 727 tp = sp->s_ttyp; 728 SESS_UNLOCK(sp); 729 } 730 } 731 if ((p->p_flag & P_CONTROLT) && tp != NULL) { 732 kp->ki_tdev = dev2udev(tp->t_dev); 733 kp->ki_tpgid = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PID; 734 if (tp->t_session) 735 kp->ki_tsid = tp->t_session->s_sid; 736 } else 737 kp->ki_tdev = NODEV; 738 if (p->p_comm[0] != '\0') 739 strlcpy(kp->ki_comm, p->p_comm, sizeof(kp->ki_comm)); 740 if (p->p_sysent && p->p_sysent->sv_name != NULL && 741 p->p_sysent->sv_name[0] != '\0') 742 strlcpy(kp->ki_emul, p->p_sysent->sv_name, sizeof(kp->ki_emul)); 743 kp->ki_siglist = p->p_siglist; 744 kp->ki_xstat = p->p_xstat; 745 kp->ki_acflag = p->p_acflag; 746 kp->ki_lock = p->p_lock; 747 if (p->p_pptr) 748 kp->ki_ppid = p->p_pptr->p_pid; 749 } 750 751 /* 752 * Fill in information that is thread specific. 753 * Must be called with p_slock locked. 754 */ 755 static void 756 fill_kinfo_thread(struct thread *td, struct kinfo_proc *kp) 757 { 758 struct proc *p; 759 760 p = td->td_proc; 761 PROC_SLOCK_ASSERT(p, MA_OWNED); 762 763 thread_lock(td); 764 if (td->td_wmesg != NULL) 765 strlcpy(kp->ki_wmesg, td->td_wmesg, sizeof(kp->ki_wmesg)); 766 else 767 bzero(kp->ki_wmesg, sizeof(kp->ki_wmesg)); 768 if (td->td_name[0] != '\0') 769 strlcpy(kp->ki_ocomm, td->td_name, sizeof(kp->ki_ocomm)); 770 if (TD_ON_LOCK(td)) { 771 kp->ki_kiflag |= KI_LOCKBLOCK; 772 strlcpy(kp->ki_lockname, td->td_lockname, 773 sizeof(kp->ki_lockname)); 774 } else { 775 kp->ki_kiflag &= ~KI_LOCKBLOCK; 776 bzero(kp->ki_lockname, sizeof(kp->ki_lockname)); 777 } 778 779 if (p->p_state == PRS_NORMAL) { /* XXXKSE very approximate */ 780 if (TD_ON_RUNQ(td) || 781 TD_CAN_RUN(td) || 782 TD_IS_RUNNING(td)) { 783 kp->ki_stat = SRUN; 784 } else if (P_SHOULDSTOP(p)) { 785 kp->ki_stat = SSTOP; 786 } else if (TD_IS_SLEEPING(td)) { 787 kp->ki_stat = SSLEEP; 788 } else if (TD_ON_LOCK(td)) { 789 kp->ki_stat = SLOCK; 790 } else { 791 kp->ki_stat = SWAIT; 792 } 793 } else if (p->p_state == PRS_ZOMBIE) { 794 kp->ki_stat = SZOMB; 795 } else { 796 kp->ki_stat = SIDL; 797 } 798 799 /* Things in the thread */ 800 kp->ki_wchan = td->td_wchan; 801 kp->ki_pri.pri_level = td->td_priority; 802 kp->ki_pri.pri_native = td->td_base_pri; 803 kp->ki_lastcpu = td->td_lastcpu; 804 kp->ki_oncpu = td->td_oncpu; 805 kp->ki_tdflags = td->td_flags; 806 kp->ki_tid = td->td_tid; 807 kp->ki_numthreads = p->p_numthreads; 808 kp->ki_pcb = td->td_pcb; 809 kp->ki_kstack = (void *)td->td_kstack; 810 kp->ki_pctcpu = sched_pctcpu(td); 811 kp->ki_estcpu = td->td_estcpu; 812 kp->ki_slptime = td->td_slptime; 813 kp->ki_pri.pri_class = td->td_pri_class; 814 kp->ki_pri.pri_user = td->td_user_pri; 815 816 /* We can't get this anymore but ps etc never used it anyway. */ 817 kp->ki_rqindex = 0; 818 819 SIGSETOR(kp->ki_siglist, td->td_siglist); 820 kp->ki_sigmask = td->td_sigmask; 821 thread_unlock(td); 822 } 823 824 /* 825 * Fill in a kinfo_proc structure for the specified process. 826 * Must be called with the target process locked. 827 */ 828 void 829 fill_kinfo_proc(struct proc *p, struct kinfo_proc *kp) 830 { 831 832 fill_kinfo_proc_only(p, kp); 833 PROC_SLOCK(p); 834 if (FIRST_THREAD_IN_PROC(p) != NULL) 835 fill_kinfo_thread(FIRST_THREAD_IN_PROC(p), kp); 836 PROC_SUNLOCK(p); 837 } 838 839 struct pstats * 840 pstats_alloc(void) 841 { 842 843 return (malloc(sizeof(struct pstats), M_SUBPROC, M_ZERO|M_WAITOK)); 844 } 845 846 /* 847 * Copy parts of p_stats; zero the rest of p_stats (statistics). 848 */ 849 void 850 pstats_fork(struct pstats *src, struct pstats *dst) 851 { 852 853 bzero(&dst->pstat_startzero, 854 __rangeof(struct pstats, pstat_startzero, pstat_endzero)); 855 bcopy(&src->pstat_startcopy, &dst->pstat_startcopy, 856 __rangeof(struct pstats, pstat_startcopy, pstat_endcopy)); 857 } 858 859 void 860 pstats_free(struct pstats *ps) 861 { 862 863 free(ps, M_SUBPROC); 864 } 865 866 /* 867 * Locate a zombie process by number 868 */ 869 struct proc * 870 zpfind(pid_t pid) 871 { 872 struct proc *p; 873 874 sx_slock(&allproc_lock); 875 LIST_FOREACH(p, &zombproc, p_list) 876 if (p->p_pid == pid) { 877 PROC_LOCK(p); 878 break; 879 } 880 sx_sunlock(&allproc_lock); 881 return (p); 882 } 883 884 #define KERN_PROC_ZOMBMASK 0x3 885 #define KERN_PROC_NOTHREADS 0x4 886 887 /* 888 * Must be called with the process locked and will return with it unlocked. 889 */ 890 static int 891 sysctl_out_proc(struct proc *p, struct sysctl_req *req, int flags) 892 { 893 struct thread *td; 894 struct kinfo_proc kinfo_proc; 895 int error = 0; 896 struct proc *np; 897 pid_t pid = p->p_pid; 898 899 PROC_LOCK_ASSERT(p, MA_OWNED); 900 901 fill_kinfo_proc_only(p, &kinfo_proc); 902 if (flags & KERN_PROC_NOTHREADS) { 903 PROC_SLOCK(p); 904 if (FIRST_THREAD_IN_PROC(p) != NULL) 905 fill_kinfo_thread(FIRST_THREAD_IN_PROC(p), &kinfo_proc); 906 PROC_SUNLOCK(p); 907 error = SYSCTL_OUT(req, (caddr_t)&kinfo_proc, 908 sizeof(kinfo_proc)); 909 } else { 910 PROC_SLOCK(p); 911 if (FIRST_THREAD_IN_PROC(p) != NULL) 912 FOREACH_THREAD_IN_PROC(p, td) { 913 fill_kinfo_thread(td, &kinfo_proc); 914 error = SYSCTL_OUT(req, (caddr_t)&kinfo_proc, 915 sizeof(kinfo_proc)); 916 if (error) 917 break; 918 } 919 else 920 error = SYSCTL_OUT(req, (caddr_t)&kinfo_proc, 921 sizeof(kinfo_proc)); 922 PROC_SUNLOCK(p); 923 } 924 PROC_UNLOCK(p); 925 if (error) 926 return (error); 927 if (flags & KERN_PROC_ZOMBMASK) 928 np = zpfind(pid); 929 else { 930 if (pid == 0) 931 return (0); 932 np = pfind(pid); 933 } 934 if (np == NULL) 935 return EAGAIN; 936 if (np != p) { 937 PROC_UNLOCK(np); 938 return EAGAIN; 939 } 940 PROC_UNLOCK(np); 941 return (0); 942 } 943 944 static int 945 sysctl_kern_proc(SYSCTL_HANDLER_ARGS) 946 { 947 int *name = (int*) arg1; 948 u_int namelen = arg2; 949 struct proc *p; 950 int flags, doingzomb, oid_number; 951 int error = 0; 952 953 oid_number = oidp->oid_number; 954 if (oid_number != KERN_PROC_ALL && 955 (oid_number & KERN_PROC_INC_THREAD) == 0) 956 flags = KERN_PROC_NOTHREADS; 957 else { 958 flags = 0; 959 oid_number &= ~KERN_PROC_INC_THREAD; 960 } 961 if (oid_number == KERN_PROC_PID) { 962 if (namelen != 1) 963 return (EINVAL); 964 error = sysctl_wire_old_buffer(req, 0); 965 if (error) 966 return (error); 967 p = pfind((pid_t)name[0]); 968 if (!p) 969 return (ESRCH); 970 if ((error = p_cansee(curthread, p))) { 971 PROC_UNLOCK(p); 972 return (error); 973 } 974 error = sysctl_out_proc(p, req, flags); 975 return (error); 976 } 977 978 switch (oid_number) { 979 case KERN_PROC_ALL: 980 if (namelen != 0) 981 return (EINVAL); 982 break; 983 case KERN_PROC_PROC: 984 if (namelen != 0 && namelen != 1) 985 return (EINVAL); 986 break; 987 default: 988 if (namelen != 1) 989 return (EINVAL); 990 break; 991 } 992 993 if (!req->oldptr) { 994 /* overestimate by 5 procs */ 995 error = SYSCTL_OUT(req, 0, sizeof (struct kinfo_proc) * 5); 996 if (error) 997 return (error); 998 } 999 error = sysctl_wire_old_buffer(req, 0); 1000 if (error != 0) 1001 return (error); 1002 sx_slock(&allproc_lock); 1003 for (doingzomb=0 ; doingzomb < 2 ; doingzomb++) { 1004 if (!doingzomb) 1005 p = LIST_FIRST(&allproc); 1006 else 1007 p = LIST_FIRST(&zombproc); 1008 for (; p != 0; p = LIST_NEXT(p, p_list)) { 1009 /* 1010 * Skip embryonic processes. 1011 */ 1012 PROC_SLOCK(p); 1013 if (p->p_state == PRS_NEW) { 1014 PROC_SUNLOCK(p); 1015 continue; 1016 } 1017 PROC_SUNLOCK(p); 1018 PROC_LOCK(p); 1019 KASSERT(p->p_ucred != NULL, 1020 ("process credential is NULL for non-NEW proc")); 1021 /* 1022 * Show a user only appropriate processes. 1023 */ 1024 if (p_cansee(curthread, p)) { 1025 PROC_UNLOCK(p); 1026 continue; 1027 } 1028 /* 1029 * TODO - make more efficient (see notes below). 1030 * do by session. 1031 */ 1032 switch (oid_number) { 1033 1034 case KERN_PROC_GID: 1035 if (p->p_ucred->cr_gid != (gid_t)name[0]) { 1036 PROC_UNLOCK(p); 1037 continue; 1038 } 1039 break; 1040 1041 case KERN_PROC_PGRP: 1042 /* could do this by traversing pgrp */ 1043 if (p->p_pgrp == NULL || 1044 p->p_pgrp->pg_id != (pid_t)name[0]) { 1045 PROC_UNLOCK(p); 1046 continue; 1047 } 1048 break; 1049 1050 case KERN_PROC_RGID: 1051 if (p->p_ucred->cr_rgid != (gid_t)name[0]) { 1052 PROC_UNLOCK(p); 1053 continue; 1054 } 1055 break; 1056 1057 case KERN_PROC_SESSION: 1058 if (p->p_session == NULL || 1059 p->p_session->s_sid != (pid_t)name[0]) { 1060 PROC_UNLOCK(p); 1061 continue; 1062 } 1063 break; 1064 1065 case KERN_PROC_TTY: 1066 if ((p->p_flag & P_CONTROLT) == 0 || 1067 p->p_session == NULL) { 1068 PROC_UNLOCK(p); 1069 continue; 1070 } 1071 SESS_LOCK(p->p_session); 1072 if (p->p_session->s_ttyp == NULL || 1073 dev2udev(p->p_session->s_ttyp->t_dev) != 1074 (dev_t)name[0]) { 1075 SESS_UNLOCK(p->p_session); 1076 PROC_UNLOCK(p); 1077 continue; 1078 } 1079 SESS_UNLOCK(p->p_session); 1080 break; 1081 1082 case KERN_PROC_UID: 1083 if (p->p_ucred->cr_uid != (uid_t)name[0]) { 1084 PROC_UNLOCK(p); 1085 continue; 1086 } 1087 break; 1088 1089 case KERN_PROC_RUID: 1090 if (p->p_ucred->cr_ruid != (uid_t)name[0]) { 1091 PROC_UNLOCK(p); 1092 continue; 1093 } 1094 break; 1095 1096 case KERN_PROC_PROC: 1097 break; 1098 1099 default: 1100 break; 1101 1102 } 1103 1104 error = sysctl_out_proc(p, req, flags | doingzomb); 1105 if (error) { 1106 sx_sunlock(&allproc_lock); 1107 return (error); 1108 } 1109 } 1110 } 1111 sx_sunlock(&allproc_lock); 1112 return (0); 1113 } 1114 1115 struct pargs * 1116 pargs_alloc(int len) 1117 { 1118 struct pargs *pa; 1119 1120 MALLOC(pa, struct pargs *, sizeof(struct pargs) + len, M_PARGS, 1121 M_WAITOK); 1122 refcount_init(&pa->ar_ref, 1); 1123 pa->ar_length = len; 1124 return (pa); 1125 } 1126 1127 void 1128 pargs_free(struct pargs *pa) 1129 { 1130 1131 FREE(pa, M_PARGS); 1132 } 1133 1134 void 1135 pargs_hold(struct pargs *pa) 1136 { 1137 1138 if (pa == NULL) 1139 return; 1140 refcount_acquire(&pa->ar_ref); 1141 } 1142 1143 void 1144 pargs_drop(struct pargs *pa) 1145 { 1146 1147 if (pa == NULL) 1148 return; 1149 if (refcount_release(&pa->ar_ref)) 1150 pargs_free(pa); 1151 } 1152 1153 /* 1154 * This sysctl allows a process to retrieve the argument list or process 1155 * title for another process without groping around in the address space 1156 * of the other process. It also allow a process to set its own "process 1157 * title to a string of its own choice. 1158 */ 1159 static int 1160 sysctl_kern_proc_args(SYSCTL_HANDLER_ARGS) 1161 { 1162 int *name = (int*) arg1; 1163 u_int namelen = arg2; 1164 struct pargs *newpa, *pa; 1165 struct proc *p; 1166 int error = 0; 1167 1168 if (namelen != 1) 1169 return (EINVAL); 1170 1171 p = pfind((pid_t)name[0]); 1172 if (!p) 1173 return (ESRCH); 1174 1175 if ((error = p_cansee(curthread, p)) != 0) { 1176 PROC_UNLOCK(p); 1177 return (error); 1178 } 1179 1180 if (req->newptr && curproc != p) { 1181 PROC_UNLOCK(p); 1182 return (EPERM); 1183 } 1184 1185 pa = p->p_args; 1186 pargs_hold(pa); 1187 PROC_UNLOCK(p); 1188 if (req->oldptr != NULL && pa != NULL) 1189 error = SYSCTL_OUT(req, pa->ar_args, pa->ar_length); 1190 pargs_drop(pa); 1191 if (error != 0 || req->newptr == NULL) 1192 return (error); 1193 1194 if (req->newlen + sizeof(struct pargs) > ps_arg_cache_limit) 1195 return (ENOMEM); 1196 newpa = pargs_alloc(req->newlen); 1197 error = SYSCTL_IN(req, newpa->ar_args, req->newlen); 1198 if (error != 0) { 1199 pargs_free(newpa); 1200 return (error); 1201 } 1202 PROC_LOCK(p); 1203 pa = p->p_args; 1204 p->p_args = newpa; 1205 PROC_UNLOCK(p); 1206 pargs_drop(pa); 1207 return (0); 1208 } 1209 1210 /* 1211 * This sysctl allows a process to retrieve the path of the executable for 1212 * itself or another process. 1213 */ 1214 static int 1215 sysctl_kern_proc_pathname(SYSCTL_HANDLER_ARGS) 1216 { 1217 pid_t *pidp = (pid_t *)arg1; 1218 unsigned int arglen = arg2; 1219 struct proc *p; 1220 struct vnode *vp; 1221 char *retbuf, *freebuf; 1222 int error; 1223 1224 if (arglen != 1) 1225 return (EINVAL); 1226 if (*pidp == -1) { /* -1 means this process */ 1227 p = req->td->td_proc; 1228 } else { 1229 p = pfind(*pidp); 1230 if (p == NULL) 1231 return (ESRCH); 1232 if ((error = p_cansee(curthread, p)) != 0) { 1233 PROC_UNLOCK(p); 1234 return (error); 1235 } 1236 } 1237 1238 vp = p->p_textvp; 1239 vref(vp); 1240 if (*pidp != -1) 1241 PROC_UNLOCK(p); 1242 error = vn_fullpath(req->td, vp, &retbuf, &freebuf); 1243 vrele(vp); 1244 if (error) 1245 return (error); 1246 error = SYSCTL_OUT(req, retbuf, strlen(retbuf) + 1); 1247 free(freebuf, M_TEMP); 1248 return (error); 1249 } 1250 1251 static int 1252 sysctl_kern_proc_sv_name(SYSCTL_HANDLER_ARGS) 1253 { 1254 struct proc *p; 1255 char *sv_name; 1256 int *name; 1257 int namelen; 1258 int error; 1259 1260 namelen = arg2; 1261 if (namelen != 1) 1262 return (EINVAL); 1263 1264 name = (int *)arg1; 1265 if ((p = pfind((pid_t)name[0])) == NULL) 1266 return (ESRCH); 1267 if ((error = p_cansee(curthread, p))) { 1268 PROC_UNLOCK(p); 1269 return (error); 1270 } 1271 sv_name = p->p_sysent->sv_name; 1272 PROC_UNLOCK(p); 1273 return (sysctl_handle_string(oidp, sv_name, 0, req)); 1274 } 1275 1276 1277 static SYSCTL_NODE(_kern, KERN_PROC, proc, CTLFLAG_RD, 0, "Process table"); 1278 1279 SYSCTL_PROC(_kern_proc, KERN_PROC_ALL, all, CTLFLAG_RD|CTLTYPE_STRUCT, 1280 0, 0, sysctl_kern_proc, "S,proc", "Return entire process table"); 1281 1282 static SYSCTL_NODE(_kern_proc, KERN_PROC_GID, gid, CTLFLAG_RD, 1283 sysctl_kern_proc, "Process table"); 1284 1285 static SYSCTL_NODE(_kern_proc, KERN_PROC_PGRP, pgrp, CTLFLAG_RD, 1286 sysctl_kern_proc, "Process table"); 1287 1288 static SYSCTL_NODE(_kern_proc, KERN_PROC_RGID, rgid, CTLFLAG_RD, 1289 sysctl_kern_proc, "Process table"); 1290 1291 static SYSCTL_NODE(_kern_proc, KERN_PROC_SESSION, sid, CTLFLAG_RD, 1292 sysctl_kern_proc, "Process table"); 1293 1294 static SYSCTL_NODE(_kern_proc, KERN_PROC_TTY, tty, CTLFLAG_RD, 1295 sysctl_kern_proc, "Process table"); 1296 1297 static SYSCTL_NODE(_kern_proc, KERN_PROC_UID, uid, CTLFLAG_RD, 1298 sysctl_kern_proc, "Process table"); 1299 1300 static SYSCTL_NODE(_kern_proc, KERN_PROC_RUID, ruid, CTLFLAG_RD, 1301 sysctl_kern_proc, "Process table"); 1302 1303 static SYSCTL_NODE(_kern_proc, KERN_PROC_PID, pid, CTLFLAG_RD, 1304 sysctl_kern_proc, "Process table"); 1305 1306 static SYSCTL_NODE(_kern_proc, KERN_PROC_PROC, proc, CTLFLAG_RD, 1307 sysctl_kern_proc, "Return process table, no threads"); 1308 1309 static SYSCTL_NODE(_kern_proc, KERN_PROC_ARGS, args, 1310 CTLFLAG_RW | CTLFLAG_ANYBODY, 1311 sysctl_kern_proc_args, "Process argument list"); 1312 1313 static SYSCTL_NODE(_kern_proc, KERN_PROC_PATHNAME, pathname, CTLFLAG_RD, 1314 sysctl_kern_proc_pathname, "Process executable path"); 1315 1316 static SYSCTL_NODE(_kern_proc, KERN_PROC_SV_NAME, sv_name, CTLFLAG_RD, 1317 sysctl_kern_proc_sv_name, "Process syscall vector name (ABI type)"); 1318 1319 static SYSCTL_NODE(_kern_proc, (KERN_PROC_GID | KERN_PROC_INC_THREAD), gid_td, 1320 CTLFLAG_RD, sysctl_kern_proc, "Process table"); 1321 1322 static SYSCTL_NODE(_kern_proc, (KERN_PROC_PGRP | KERN_PROC_INC_THREAD), pgrp_td, 1323 CTLFLAG_RD, sysctl_kern_proc, "Process table"); 1324 1325 static SYSCTL_NODE(_kern_proc, (KERN_PROC_RGID | KERN_PROC_INC_THREAD), rgid_td, 1326 CTLFLAG_RD, sysctl_kern_proc, "Process table"); 1327 1328 static SYSCTL_NODE(_kern_proc, (KERN_PROC_SESSION | KERN_PROC_INC_THREAD), 1329 sid_td, CTLFLAG_RD, sysctl_kern_proc, "Process table"); 1330 1331 static SYSCTL_NODE(_kern_proc, (KERN_PROC_TTY | KERN_PROC_INC_THREAD), tty_td, 1332 CTLFLAG_RD, sysctl_kern_proc, "Process table"); 1333 1334 static SYSCTL_NODE(_kern_proc, (KERN_PROC_UID | KERN_PROC_INC_THREAD), uid_td, 1335 CTLFLAG_RD, sysctl_kern_proc, "Process table"); 1336 1337 static SYSCTL_NODE(_kern_proc, (KERN_PROC_RUID | KERN_PROC_INC_THREAD), ruid_td, 1338 CTLFLAG_RD, sysctl_kern_proc, "Process table"); 1339 1340 static SYSCTL_NODE(_kern_proc, (KERN_PROC_PID | KERN_PROC_INC_THREAD), pid_td, 1341 CTLFLAG_RD, sysctl_kern_proc, "Process table"); 1342 1343 static SYSCTL_NODE(_kern_proc, (KERN_PROC_PROC | KERN_PROC_INC_THREAD), proc_td, 1344 CTLFLAG_RD, sysctl_kern_proc, "Return process table, no threads"); 1345