- Gigabyte G33-S2H fixup, due to the present of multiple competing
[dragonfly.git] / sys / kern / kern_kinfo.c
blob22fba51cce8f395c6622f393f69721462e6bc607
1 /*-
2 * Copyright (c) 2007 The DragonFly Project. All rights reserved.
3 *
4 * This code is derived from software contributed to The DragonFly Project
5 * by Simon 'corecode' Schubert <corecode@fs.ei.tum.de>
6 * by Thomas E. Spanjaard <tgen@netphreax.net>
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in
16 * the documentation and/or other materials provided with the
17 * distribution.
18 * 3. Neither the name of The DragonFly Project nor the names of its
19 * contributors may be used to endorse or promote products derived
20 * from this software without specific, prior written permission.
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
28 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
30 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
31 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
32 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
35 * $DragonFly: src/sys/kern/kern_kinfo.c,v 1.16 2007/10/21 16:45:17 dillon Exp $
39 * This is a source file used by both the kernel and libkvm.
42 #ifndef _KERNEL
43 #define _KERNEL_STRUCTURES
44 #endif
46 #include <sys/proc.h>
47 #include <vm/vm_map.h>
48 #include <sys/kinfo.h>
49 #include <sys/tty.h>
50 #include <sys/conf.h>
51 #include <sys/jail.h>
52 #include <sys/globaldata.h>
53 #ifdef _KERNEL
54 #include <sys/systm.h>
55 #else
56 #include <string.h>
57 #endif
61 * Fill in a struct kinfo_proc.
63 void
64 fill_kinfo_proc(struct proc *p, struct kinfo_proc *kp)
66 struct session *sess;
67 struct pgrp *pgrp;
70 * NOTE: pgrp and sess can wind up NULL if we caught a process
71 * in the middle of exiting.
73 pgrp = p->p_pgrp;
74 sess = pgrp ? pgrp->pg_session : NULL;
76 bzero(kp, sizeof(*kp));
78 kp->kp_paddr = (uintptr_t)p;
79 kp->kp_fd = (uintptr_t)p->p_fd;
81 kp->kp_flags = p->p_flag;
82 kp->kp_stat = p->p_stat;
83 kp->kp_lock = p->p_lock;
84 kp->kp_acflag = p->p_acflag;
85 kp->kp_traceflag = p->p_traceflag;
86 kp->kp_siglist = p->p_siglist;
87 if (p->p_sigacts) {
88 kp->kp_sigignore = p->p_sigignore; /* p_sigacts-> */
89 kp->kp_sigcatch = p->p_sigcatch; /* p_sigacts-> */
90 kp->kp_sigflag = p->p_sigacts->ps_flag;
92 kp->kp_start = p->p_start;
94 strncpy(kp->kp_comm, p->p_comm, sizeof(kp->kp_comm) - 1);
95 kp->kp_comm[sizeof(kp->kp_comm) - 1] = 0;
97 kp->kp_uid = p->p_ucred->cr_uid;
98 kp->kp_ngroups = p->p_ucred->cr_ngroups;
99 bcopy(p->p_ucred->cr_groups, kp->kp_groups,
100 NGROUPS * sizeof(kp->kp_groups[0]));
101 kp->kp_ruid = p->p_ucred->cr_ruid;
102 kp->kp_svuid = p->p_ucred->cr_svuid;
103 kp->kp_rgid = p->p_ucred->cr_rgid;
104 kp->kp_svgid = p->p_ucred->cr_svgid;
106 kp->kp_pid = p->p_pid;
107 if (p->p_oppid != 0)
108 kp->kp_ppid = p->p_oppid;
109 else
110 kp->kp_ppid = p->p_pptr != NULL ? p->p_pptr->p_pid : -1;
111 if (pgrp) {
112 kp->kp_pgid = pgrp->pg_id;
113 kp->kp_jobc = pgrp->pg_jobc;
115 if (sess) {
116 kp->kp_sid = sess->s_sid;
117 bcopy(sess->s_login, kp->kp_login, MAXLOGNAME);
118 if (sess->s_ttyvp != NULL)
119 kp->kp_auxflags |= KI_CTTY;
120 if (SESS_LEADER(p))
121 kp->kp_auxflags |= KI_SLEADER;
123 if (sess && (p->p_flag & P_CONTROLT) != 0 && sess->s_ttyp != NULL) {
124 kp->kp_tdev = dev2udev(sess->s_ttyp->t_dev);
125 if (sess->s_ttyp->t_pgrp != NULL)
126 kp->kp_tpgid = sess->s_ttyp->t_pgrp->pg_id;
127 else
128 kp->kp_tpgid = -1;
129 if (sess->s_ttyp->t_session != NULL)
130 kp->kp_tsid = sess->s_ttyp->t_session->s_sid;
131 else
132 kp->kp_tsid = -1;
133 } else {
134 kp->kp_tdev = NOUDEV;
136 kp->kp_exitstat = p->p_xstat;
137 kp->kp_nthreads = p->p_nthreads;
138 kp->kp_nice = p->p_nice;
139 kp->kp_swtime = p->p_swtime;
141 kp->kp_vm_map_size = p->p_vmspace->vm_map.size;
142 kp->kp_vm_rssize = vmspace_resident_count(p->p_vmspace);
143 kp->kp_vm_swrss = p->p_vmspace->vm_swrss;
144 kp->kp_vm_tsize = p->p_vmspace->vm_tsize;
145 kp->kp_vm_dsize = p->p_vmspace->vm_dsize;
146 kp->kp_vm_ssize = p->p_vmspace->vm_ssize;
148 if (jailed(p->p_ucred))
149 kp->kp_jailid = p->p_ucred->cr_prison->pr_id;
151 kp->kp_ru = p->p_ru;
152 kp->kp_ru = p->p_cru;
156 * Fill in a struct kinfo_lwp.
158 void
159 fill_kinfo_lwp(struct lwp *lwp, struct kinfo_lwp *kl)
161 bzero(kl, sizeof(*kl));
163 kl->kl_pid = lwp->lwp_proc->p_pid;
164 kl->kl_tid = lwp->lwp_tid;
166 kl->kl_flags = lwp->lwp_flag;
167 kl->kl_stat = lwp->lwp_stat;
168 kl->kl_lock = lwp->lwp_lock;
169 kl->kl_tdflags = lwp->lwp_thread->td_flags;
172 * The process/lwp stat may not reflect whether the process is
173 * actually sleeping or not if the related thread was directly
174 * descheduled by LWKT. Adjust the stat if the thread is not
175 * runnable and not waiting to be scheduled on a cpu by the
176 * user process scheduler.
178 if (kl->kl_stat == LSRUN) {
179 if ((kl->kl_tdflags & TDF_RUNQ) == 0 &&
180 (lwp->lwp_flag & LWP_ONRUNQ) == 0) {
181 kl->kl_stat = LSSLEEP;
184 #ifdef SMP
185 kl->kl_mpcount = lwp->lwp_thread->td_mpcount;
186 #else
187 kl->kl_mpcount = 0;
188 #endif
190 kl->kl_prio = lwp->lwp_usdata.bsd4.priority; /* XXX TGEN dangerous assumption */
191 kl->kl_tdprio = lwp->lwp_thread->td_pri;
192 kl->kl_rtprio = lwp->lwp_rtprio;
194 kl->kl_uticks = lwp->lwp_thread->td_uticks;
195 kl->kl_sticks = lwp->lwp_thread->td_sticks;
196 kl->kl_iticks = lwp->lwp_thread->td_iticks;
197 kl->kl_cpticks = lwp->lwp_cpticks;
198 kl->kl_pctcpu = lwp->lwp_pctcpu;
199 kl->kl_slptime = lwp->lwp_slptime;
200 kl->kl_origcpu = lwp->lwp_usdata.bsd4.origcpu; /* XXX TGEN same */
201 kl->kl_estcpu = lwp->lwp_usdata.bsd4.estcpu;
202 kl->kl_cpuid = lwp->lwp_thread->td_gd->gd_cpuid;
204 kl->kl_ru = lwp->lwp_ru;
206 kl->kl_siglist = lwp->lwp_siglist;
207 kl->kl_sigmask = lwp->lwp_sigmask;
209 kl->kl_wchan = (uintptr_t)lwp->lwp_thread->td_wchan;
210 if (lwp->lwp_thread->td_wmesg) {
211 strncpy(kl->kl_wmesg, lwp->lwp_thread->td_wmesg, WMESGLEN);
212 kl->kl_wmesg[WMESGLEN] = 0;
217 * Fill in a struct kinfo_proc for kernel threads (i.e. those without proc).
219 void
220 fill_kinfo_proc_kthread(struct thread *td, struct kinfo_proc *kp)
222 bzero(kp, sizeof(*kp));
225 * Fill in fake proc information and semi-fake lwp info.
227 kp->kp_pid = -1;
228 kp->kp_tdev = NOUDEV;
229 strncpy(kp->kp_comm, td->td_comm, sizeof(kp->kp_comm) - 1);
230 kp->kp_comm[sizeof(kp->kp_comm) - 1] = 0;
231 kp->kp_flags = P_SYSTEM;
232 kp->kp_stat = SACTIVE;
234 kp->kp_lwp.kl_pid = -1;
235 kp->kp_lwp.kl_tid = -1;
236 kp->kp_lwp.kl_tdflags = td->td_flags;
237 #ifdef SMP
238 kp->kp_lwp.kl_mpcount = td->td_mpcount;
239 #else /* !SMP */
240 kp->kp_lwp.kl_mpcount = 0;
241 #endif /* SMP */
243 kp->kp_lwp.kl_tdprio = td->td_pri;
244 kp->kp_lwp.kl_rtprio.type = RTP_PRIO_THREAD;
245 kp->kp_lwp.kl_rtprio.prio = td->td_pri & TDPRI_MASK;
247 kp->kp_lwp.kl_uticks = td->td_uticks;
248 kp->kp_lwp.kl_sticks = td->td_sticks;
249 kp->kp_lwp.kl_iticks = td->td_iticks;
250 kp->kp_lwp.kl_cpuid = td->td_gd->gd_cpuid;
252 kp->kp_lwp.kl_wchan = (uintptr_t)td->td_wchan;
253 if (td->td_flags & TDF_RUNQ)
254 kp->kp_lwp.kl_stat = LSRUN;
255 else
256 kp->kp_lwp.kl_stat = LSSLEEP;
257 if (td->td_wmesg) {
258 strncpy(kp->kp_lwp.kl_wmesg, td->td_wmesg, WMESGLEN);
259 kp->kp_lwp.kl_wmesg[WMESGLEN] = 0;