xref: /dragonfly/sys/sys/kinfo.h (revision bcb3e04d)
1 /*
2  * Copyright (c) 2004 The DragonFly Project.  All rights reserved.
3  *
4  * This code is derived from software contributed to The DragonFly Project
5  * by Joerg Sonnenberger <joerg@bec.de>.
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  *
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in
15  *    the documentation and/or other materials provided with the
16  *    distribution.
17  * 3. Neither the name of The DragonFly Project nor the names of its
18  *    contributors may be used to endorse or promote products derived
19  *    from this software without specific, prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
25  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  *
34  * $DragonFly: src/sys/sys/kinfo.h,v 1.13 2007/02/18 16:17:09 corecode Exp $
35  */
36 
37 #ifndef _SYS_KINFO_H_
38 #define _SYS_KINFO_H_
39 
40 #ifndef _KERNEL_STRUCTURES
41 #define _KERNEL_STRUCTURES
42 #endif
43 
44 #ifndef _SYS_TYPES_H_
45 #include <sys/types.h>
46 #endif
47 #ifndef _SYS_PARAM_H_
48 #include <sys/param.h>
49 #endif
50 #include <sys/resource.h>
51 #include <sys/rtprio.h>
52 #include <sys/proc.h>
53 
54 struct kinfo_file {
55 	size_t	 f_size;	/* size of struct kinfo_file */
56 	pid_t	 f_pid;		/* owning process */
57 	uid_t	 f_uid;		/* effective uid of owning process */
58 	int	 f_fd;		/* descriptor number */
59 	void	*f_file;	/* address of struct file */
60 	short	 f_type;	/* descriptor type */
61 	int	 f_count;	/* reference count */
62 	int	 f_msgcount;	/* references from message queue */
63 	off_t	 f_offset;	/* file offset */
64 	void	*f_data;	/* file descriptor specific data */
65 	u_int	 f_flag;	/* flags (see fcntl.h) */
66 };
67 
68 /*
69  * CPU time statistics
70  */
71 struct kinfo_cputime {
72 	uint64_t	cp_user;
73 	uint64_t	cp_nice;
74 	uint64_t	cp_sys;
75 	uint64_t	cp_intr;
76 	uint64_t	cp_idle;
77 	uint64_t	cp_unused01;
78 	uint64_t	cp_unused02;
79 	uint64_t	cp_unused03;
80 	uint64_t	cp_stallpc;	/* code stall address */
81 	char		cp_msg[32];	/* code stall token or mplock */
82 };
83 
84 /*
85  * CPU system/interrupt program counter sampler
86  */
87 #define PCTRACK_ARYSIZE	32	/* must be a power of 2 */
88 #define PCTRACK_ARYMASK	(PCTRACK_ARYSIZE - 1)
89 
90 struct kinfo_pcheader {
91 	int		pc_ntrack;	/* number of tracks per cpu (2) */
92 	int		pc_arysize;	/* size of storage array (32) */
93 };
94 
95 struct kinfo_pctrack {
96 	int		pc_index;
97 	void		*pc_array[PCTRACK_ARYSIZE];
98 };
99 
100 #define PCTRACK_SYS	0
101 #define PCTRACK_INT	1
102 #define PCTRACK_SIZE	2
103 
104 struct kinfo_clockinfo {
105 	int	ci_hz;		/* clock frequency */
106 	int	ci_tick;	/* micro-seconds per hz tick */
107 	int	ci_tickadj;	/* clock skew rate for adjtime() */
108 	int	ci_stathz;	/* statistics clock frequency */
109 	int	ci_profhz;	/* profiling clock frequency */
110 };
111 
112 /*
113  * Structure definition for the lwp-specific data in struct kinfo_proc.
114  */
115 struct kinfo_lwp {
116 	pid_t		kl_pid;		/* PID of our associated proc */
117 	lwpid_t		kl_tid;		/* thread id */
118 
119 	int		kl_flags;	/* LWP_ flags */
120 	enum lwpstat	kl_stat;	/* LS* lwp status */
121 	int		kl_lock;	/* lwp lock (prevent destruct) count */
122 	int		kl_tdflags;	/* thread flags */
123 	int		kl_mpcount;	/* MP lock held count */
124 	int		kl_prio;	/* scheduling priority */
125 	int		kl_tdprio;	/* lwkt sched priority */
126 	struct rtprio	kl_rtprio;	/* real-time scheduling prio */
127 
128 	/* accounting */
129 	uint64_t	kl_uticks;	/* time accounting */
130 	uint64_t	kl_sticks;
131 	uint64_t	kl_iticks;
132 	uint64_t	kl_cpticks;	/* sched quantums used */
133 	u_int		kl_pctcpu;	/* percentage cputime */
134 	u_int		kl_slptime;	/* time since last blocked */
135 	int		kl_origcpu;	/* originally scheduled on cpu */
136 	int		kl_estcpu;
137 	int		kl_cpuid;	/* CPU this lwp was last scheduled on */
138 
139 	struct rusage	kl_ru;		/* resource usage stats */
140 
141 	sigset_t	kl_siglist;	/* pending signals */
142 	sigset_t	kl_sigmask;	/* masked signals */
143 #define WMESGLEN 7
144 	uintptr_t	kl_wchan;	/* waiting channel */
145 	char		kl_wmesg[WMESGLEN+1];	/* waiting message */
146 };
147 
148 /*
149  * KERN_PROC subtype ops return arrays of normalized proc structures:
150  */
151 struct kinfo_proc {
152 	uintptr_t	kp_paddr;	/* address of this proc */
153 
154 	/* proc information */
155 	int		kp_flags;
156 	enum procstat	kp_stat;
157 	int		kp_lock;
158 	int		kp_acflag;	/* accounting flags */
159 	int		kp_traceflag;
160 
161 	uintptr_t	kp_fd;		/* address of the proc's files */
162 
163 	sigset_t	kp_siglist;
164 	sigset_t	kp_sigignore;
165 	sigset_t	kp_sigcatch;
166 	int		kp_sigflag;	/* from ps_flag */
167 	struct timeval	kp_start;
168 
169 	char		kp_comm[MAXCOMLEN+1];
170 
171 	/* cred information */
172 	uid_t		kp_uid;
173 	short		kp_ngroups;
174 	gid_t		kp_groups[NGROUPS];
175 	uid_t		kp_ruid;
176 	uid_t		kp_svuid;
177 	gid_t		kp_rgid;
178 	gid_t		kp_svgid;
179 
180 	pid_t		kp_pid;	/* process id */
181 	pid_t		kp_ppid;	/* parent process id */
182 	pid_t		kp_pgid;	/* process group id */
183 	int		kp_jobc;	/* job control counter */
184 	pid_t		kp_sid;	/* session id */
185 	char		kp_login[roundup(MAXLOGNAME, sizeof(long))];	/* setlogin() name */
186 	dev_t		kp_tdev;	/* controlling tty dev */
187 	pid_t		kp_tpgid;	/* tty process group id */
188 	pid_t		kp_tsid;	/* tty session id */
189 
190 	u_short		kp_exitstat;	/* exit status information */
191 	int		kp_nthreads;
192 	int		kp_nice;
193 	unsigned int	kp_swtime;
194 
195 	vm_size_t	kp_vm_map_size;	/* vmmap virtual size */
196 	segsz_t		kp_vm_rssize;		/* resident set size */
197 	segsz_t		kp_vm_swrss;		/* rss before last swap */
198 	segsz_t		kp_vm_tsize;		/* text size */
199 	segsz_t		kp_vm_dsize;		/* data size */
200 	segsz_t		kp_vm_ssize;		/* stack size */
201         u_int 		kp_vm_prssize;		/* proportional rss */
202 
203 	int		kp_jailid;
204 
205 	struct rusage	kp_ru;
206 	struct rusage	kp_cru;
207 
208 	int		kp_auxflags;	/* generated flags */
209 #define KI_CTTY	1
210 #define KI_SLEADER	2
211 
212 	struct kinfo_lwp kp_lwp;
213 
214 	int		kp_spare[4];
215 };
216 
217 struct proc;
218 struct lwp;
219 struct thread;
220 
221 void fill_kinfo_proc(struct proc *, struct kinfo_proc *);
222 void fill_kinfo_lwp(struct lwp *, struct kinfo_lwp *);
223 void fill_kinfo_proc_kthread(struct thread *, struct kinfo_proc *);
224 
225 #define KINFO_NEXT(kp)	((union kinfo *)((uintptr_t)kp + kp->gen.len))
226 #define KINFO_END(kp)	(kp->gen.type == KINFO_TYPE_END)
227 
228 #if defined(_KERNEL)
229 #ifdef SMP
230 #define cpu_time	cputime_percpu[mycpuid]
231 #else
232 #define cpu_time	cputime_percpu[0]
233 #endif
234 #endif
235 
236 #if defined(_KERNEL)
237 extern struct kinfo_cputime cputime_percpu[MAXCPU];
238 #endif
239 
240 #endif /* !_SYS_KINFO_H_ */
241