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