4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22 /*
23 * Copyright (c) 1988, 2010, Oracle and/or its affiliates. All rights reserved.
24 */
25
26 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
27 /* All Rights Reserved */
28
29 #ifndef _SYS_PROC_H
30 #define _SYS_PROC_H
31
32 #include <sys/time.h>
33 #include <sys/thread.h>
34 #include <sys/cred.h>
35 #include <sys/user.h>
36 #include <sys/watchpoint.h>
37 #include <sys/timer.h>
38 #if defined(__x86)
39 #include <sys/tss.h>
40 #include <sys/segments.h>
41 #endif
42 #include <sys/utrap.h>
43 #include <sys/model.h>
331
332 avl_tree_t p_ct_held; /* held contracts */
333 struct ct_equeue **p_ct_equeue; /* process-type event queues */
334
335 struct cont_process *p_ct_process; /* process contract */
336 list_node_t p_ct_member; /* process contract membership */
337 sigqueue_t *p_killsqp; /* sigqueue pointer for SIGKILL */
338
339 int p_dtrace_probes; /* are there probes for this proc? */
340 uint64_t p_dtrace_count; /* number of DTrace tracepoints */
341 /* (protected by P_PR_LOCK) */
342 void *p_dtrace_helpers; /* DTrace helpers, if any */
343 struct pool *p_pool; /* pointer to containing pool */
344 kcondvar_t p_poolcv; /* synchronization with pools */
345 uint_t p_poolcnt; /* # threads inside pool barrier */
346 uint_t p_poolflag; /* pool-related flags (see below) */
347 uintptr_t p_portcnt; /* event ports counter */
348 struct zone *p_zone; /* zone in which process lives */
349 struct vnode *p_execdir; /* directory that p_exec came from */
350 struct brand *p_brand; /* process's brand */
351 void *p_brand_data; /* per-process brand state */
352
353 /* additional lock to protect p_sessp (but not its contents) */
354 kmutex_t p_splock;
355 rctl_qty_t p_locked_mem; /* locked memory charged to proc */
356 /* protected by p_lock */
357 rctl_qty_t p_crypto_mem; /* /dev/crypto memory charged to proc */
358 /* protected by p_lock */
359 clock_t p_ttime; /* buffered task time */
360
361 /*
362 * The user structure
363 */
364 struct user p_user; /* (see sys/user.h) */
365 } proc_t;
366
367 #define PROC_T /* headers relying on proc_t are OK */
368
369 #ifdef _KERNEL
370
371 /* active process chain */
372
373 extern proc_t *practive;
374
375 /* Well known processes */
376
377 extern proc_t *proc_sched; /* memory scheduler */
378 extern proc_t *proc_init; /* init */
379 extern proc_t *proc_pageout; /* pageout daemon */
380 extern proc_t *proc_fsflush; /* filesystem sync-er */
381
382 #endif /* _KERNEL */
383
384 /*
385 * Stuff to keep track of the number of processes each uid has.
386 * It is tracked on a per-zone basis; that is, if users in different
612
613 extern void sigcld(proc_t *, sigqueue_t *);
614 extern void sigcld_delete(k_siginfo_t *);
615 extern void sigcld_repost(void);
616 extern int fsig(k_sigset_t *, kthread_t *);
617 extern void psig(void);
618 extern void stop(int, int);
619 extern int stop_on_fault(uint_t, k_siginfo_t *);
620 extern int issig(int);
621 extern int jobstopped(proc_t *);
622 extern void psignal(proc_t *, int);
623 extern void tsignal(kthread_t *, int);
624 extern void sigtoproc(proc_t *, kthread_t *, int);
625 extern void trapsig(k_siginfo_t *, int);
626 extern void realsigprof(int, int, int);
627 extern int eat_signal(kthread_t *, int);
628 extern int signal_is_blocked(kthread_t *, int);
629 extern int sigcheck(proc_t *, kthread_t *);
630 extern void sigdefault(proc_t *);
631
632 extern void pid_setmin(void);
633 extern pid_t pid_allocate(proc_t *, pid_t, int);
634 extern int pid_rele(struct pid *);
635 extern void pid_exit(proc_t *, struct task *);
636 extern void proc_entry_free(struct pid *);
637 extern proc_t *prfind(pid_t);
638 extern proc_t *prfind_zone(pid_t, zoneid_t);
639 extern proc_t *pgfind(pid_t);
640 extern proc_t *pgfind_zone(pid_t, zoneid_t);
641 extern proc_t *sprlock(pid_t);
642 extern proc_t *sprlock_zone(pid_t, zoneid_t);
643 extern int sprtrylock_proc(proc_t *);
644 extern void sprwaitlock_proc(proc_t *);
645 extern void sprlock_proc(proc_t *);
646 extern void sprunlock(proc_t *);
647 extern void pid_init(void);
648 extern proc_t *pid_entry(int);
649 extern int pid_slot(proc_t *);
650 extern void signal(pid_t, int);
651 extern void prsignal(struct pid *, int);
652 extern int uread(proc_t *, void *, size_t, uintptr_t);
653 extern int uwrite(proc_t *, void *, size_t, uintptr_t);
654
655 extern void pgsignal(struct pid *, int);
656 extern void pgjoin(proc_t *, struct pid *);
657 extern void pgcreate(proc_t *);
658 extern void pgexit(proc_t *);
659 extern void pgdetach(proc_t *);
660 extern int pgmembers(pid_t);
661
662 extern void init_mstate(kthread_t *, int);
663 extern int new_mstate(kthread_t *, int);
664 extern void restore_mstate(kthread_t *);
665 extern void term_mstate(kthread_t *);
666 extern void estimate_msacct(kthread_t *, hrtime_t);
742 id_t lwpid);
743 extern kthread_t *idtot(proc_t *, id_t);
744 extern void lwp_hash_in(proc_t *, lwpent_t *, tidhash_t *, uint_t, int);
745 extern void lwp_hash_out(proc_t *, id_t);
746 extern lwpdir_t *lwp_hash_lookup(proc_t *, id_t);
747 extern lwpdir_t *lwp_hash_lookup_and_lock(proc_t *, id_t, kmutex_t **);
748 extern void lwp_create_done(kthread_t *);
749 extern void lwp_exit(void);
750 extern void lwp_pcb_exit(void);
751 extern void lwp_cleanup(void);
752 extern int lwp_suspend(kthread_t *);
753 extern void lwp_continue(kthread_t *);
754 extern void holdlwp(void);
755 extern void stoplwp(void);
756 extern int holdlwps(int);
757 extern int holdwatch(void);
758 extern void pokelwps(proc_t *);
759 extern void continuelwps(proc_t *);
760 extern int exitlwps(int);
761 extern void lwp_ctmpl_copy(klwp_t *, klwp_t *);
762 extern void lwp_ctmpl_clear(klwp_t *);
763 extern klwp_t *forklwp(klwp_t *, proc_t *, id_t);
764 extern void lwp_load(klwp_t *, gregset_t, uintptr_t);
765 extern void lwp_setrval(klwp_t *, int, int);
766 extern void lwp_forkregs(klwp_t *, klwp_t *);
767 extern void lwp_freeregs(klwp_t *, int);
768 extern caddr_t lwp_stk_init(klwp_t *, caddr_t);
769 extern void lwp_stk_cache_init(void);
770 extern void lwp_stk_fini(klwp_t *);
771 extern void lwp_installctx(klwp_t *);
772 extern void lwp_rtt(void);
773 extern void lwp_rtt_initial(void);
774 extern int lwp_setprivate(klwp_t *, int, uintptr_t);
775 extern void lwp_stat_update(lwp_stat_id_t, long);
776 extern void lwp_attach_brand_hdlrs(klwp_t *);
777 extern void lwp_detach_brand_hdlrs(klwp_t *);
778
779 #if defined(__sparcv9)
780 extern void lwp_mmodel_newlwp(void);
781 extern void lwp_mmodel_shared_as(caddr_t, size_t);
782 #define LWP_MMODEL_NEWLWP() lwp_mmodel_newlwp()
|
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22 /*
23 * Copyright (c) 1988, 2010, Oracle and/or its affiliates. All rights reserved.
24 * Copyright (c) 2014 Joyent, Inc. All rights reserved.
25 */
26
27 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
28 /* All Rights Reserved */
29
30 #ifndef _SYS_PROC_H
31 #define _SYS_PROC_H
32
33 #include <sys/time.h>
34 #include <sys/thread.h>
35 #include <sys/cred.h>
36 #include <sys/user.h>
37 #include <sys/watchpoint.h>
38 #include <sys/timer.h>
39 #if defined(__x86)
40 #include <sys/tss.h>
41 #include <sys/segments.h>
42 #endif
43 #include <sys/utrap.h>
44 #include <sys/model.h>
332
333 avl_tree_t p_ct_held; /* held contracts */
334 struct ct_equeue **p_ct_equeue; /* process-type event queues */
335
336 struct cont_process *p_ct_process; /* process contract */
337 list_node_t p_ct_member; /* process contract membership */
338 sigqueue_t *p_killsqp; /* sigqueue pointer for SIGKILL */
339
340 int p_dtrace_probes; /* are there probes for this proc? */
341 uint64_t p_dtrace_count; /* number of DTrace tracepoints */
342 /* (protected by P_PR_LOCK) */
343 void *p_dtrace_helpers; /* DTrace helpers, if any */
344 struct pool *p_pool; /* pointer to containing pool */
345 kcondvar_t p_poolcv; /* synchronization with pools */
346 uint_t p_poolcnt; /* # threads inside pool barrier */
347 uint_t p_poolflag; /* pool-related flags (see below) */
348 uintptr_t p_portcnt; /* event ports counter */
349 struct zone *p_zone; /* zone in which process lives */
350 struct vnode *p_execdir; /* directory that p_exec came from */
351 struct brand *p_brand; /* process's brand */
352
353 /* per-process brand state */
354 void *p_brand_data;
355
356 /* additional lock to protect p_sessp (but not its contents) */
357 kmutex_t p_splock;
358 rctl_qty_t p_locked_mem; /* locked memory charged to proc */
359 /* protected by p_lock */
360 rctl_qty_t p_crypto_mem; /* /dev/crypto memory charged to proc */
361 /* protected by p_lock */
362 clock_t p_ttime; /* buffered task time */
363
364 /*
365 * The user structure
366 */
367 struct user p_user; /* (see sys/user.h) */
368 } proc_t;
369 #define PROC_T /* headers relying on proc_t are OK */
370
371 #ifdef _KERNEL
372
373 /* active process chain */
374
375 extern proc_t *practive;
376
377 /* Well known processes */
378
379 extern proc_t *proc_sched; /* memory scheduler */
380 extern proc_t *proc_init; /* init */
381 extern proc_t *proc_pageout; /* pageout daemon */
382 extern proc_t *proc_fsflush; /* filesystem sync-er */
383
384 #endif /* _KERNEL */
385
386 /*
387 * Stuff to keep track of the number of processes each uid has.
388 * It is tracked on a per-zone basis; that is, if users in different
614
615 extern void sigcld(proc_t *, sigqueue_t *);
616 extern void sigcld_delete(k_siginfo_t *);
617 extern void sigcld_repost(void);
618 extern int fsig(k_sigset_t *, kthread_t *);
619 extern void psig(void);
620 extern void stop(int, int);
621 extern int stop_on_fault(uint_t, k_siginfo_t *);
622 extern int issig(int);
623 extern int jobstopped(proc_t *);
624 extern void psignal(proc_t *, int);
625 extern void tsignal(kthread_t *, int);
626 extern void sigtoproc(proc_t *, kthread_t *, int);
627 extern void trapsig(k_siginfo_t *, int);
628 extern void realsigprof(int, int, int);
629 extern int eat_signal(kthread_t *, int);
630 extern int signal_is_blocked(kthread_t *, int);
631 extern int sigcheck(proc_t *, kthread_t *);
632 extern void sigdefault(proc_t *);
633
634 extern struct pid *pid_find(pid_t pid);
635 extern void pid_setmin(void);
636 extern pid_t pid_allocate(proc_t *, pid_t, int);
637 extern int pid_rele(struct pid *);
638 extern void pid_exit(proc_t *, struct task *);
639 extern void proc_entry_free(struct pid *);
640 extern proc_t *prfind(pid_t);
641 extern proc_t *prfind_zone(pid_t, zoneid_t);
642 extern proc_t *pgfind(pid_t);
643 extern proc_t *pgfind_zone(pid_t, zoneid_t);
644 extern proc_t *sprlock(pid_t);
645 extern proc_t *sprlock_zone(pid_t, zoneid_t);
646 extern int sprtrylock_proc(proc_t *);
647 extern void sprwaitlock_proc(proc_t *);
648 extern void sprlock_proc(proc_t *);
649 extern void sprunlock(proc_t *);
650 extern void sprunprlock(proc_t *);
651 extern void pid_init(void);
652 extern proc_t *pid_entry(int);
653 extern int pid_slot(proc_t *);
654 extern void signal(pid_t, int);
655 extern void prsignal(struct pid *, int);
656 extern int uread(proc_t *, void *, size_t, uintptr_t);
657 extern int uwrite(proc_t *, void *, size_t, uintptr_t);
658
659 extern void pgsignal(struct pid *, int);
660 extern void pgjoin(proc_t *, struct pid *);
661 extern void pgcreate(proc_t *);
662 extern void pgexit(proc_t *);
663 extern void pgdetach(proc_t *);
664 extern int pgmembers(pid_t);
665
666 extern void init_mstate(kthread_t *, int);
667 extern int new_mstate(kthread_t *, int);
668 extern void restore_mstate(kthread_t *);
669 extern void term_mstate(kthread_t *);
670 extern void estimate_msacct(kthread_t *, hrtime_t);
746 id_t lwpid);
747 extern kthread_t *idtot(proc_t *, id_t);
748 extern void lwp_hash_in(proc_t *, lwpent_t *, tidhash_t *, uint_t, int);
749 extern void lwp_hash_out(proc_t *, id_t);
750 extern lwpdir_t *lwp_hash_lookup(proc_t *, id_t);
751 extern lwpdir_t *lwp_hash_lookup_and_lock(proc_t *, id_t, kmutex_t **);
752 extern void lwp_create_done(kthread_t *);
753 extern void lwp_exit(void);
754 extern void lwp_pcb_exit(void);
755 extern void lwp_cleanup(void);
756 extern int lwp_suspend(kthread_t *);
757 extern void lwp_continue(kthread_t *);
758 extern void holdlwp(void);
759 extern void stoplwp(void);
760 extern int holdlwps(int);
761 extern int holdwatch(void);
762 extern void pokelwps(proc_t *);
763 extern void continuelwps(proc_t *);
764 extern int exitlwps(int);
765 extern void lwp_ctmpl_copy(klwp_t *, klwp_t *);
766 extern void lwp_ctmpl_clear(klwp_t *, boolean_t);
767 extern klwp_t *forklwp(klwp_t *, proc_t *, id_t);
768 extern void lwp_load(klwp_t *, gregset_t, uintptr_t);
769 extern void lwp_setrval(klwp_t *, int, int);
770 extern void lwp_forkregs(klwp_t *, klwp_t *);
771 extern void lwp_freeregs(klwp_t *, int);
772 extern caddr_t lwp_stk_init(klwp_t *, caddr_t);
773 extern void lwp_stk_cache_init(void);
774 extern void lwp_stk_fini(klwp_t *);
775 extern void lwp_installctx(klwp_t *);
776 extern void lwp_rtt(void);
777 extern void lwp_rtt_initial(void);
778 extern int lwp_setprivate(klwp_t *, int, uintptr_t);
779 extern void lwp_stat_update(lwp_stat_id_t, long);
780 extern void lwp_attach_brand_hdlrs(klwp_t *);
781 extern void lwp_detach_brand_hdlrs(klwp_t *);
782
783 #if defined(__sparcv9)
784 extern void lwp_mmodel_newlwp(void);
785 extern void lwp_mmodel_shared_as(caddr_t, size_t);
786 #define LWP_MMODEL_NEWLWP() lwp_mmodel_newlwp()
|