db_ps.c revision 118269
12322Sdg/*-
22322Sdg * Copyright (c) 1993 The Regents of the University of California.
32322Sdg * All rights reserved.
42322Sdg *
52322Sdg * Redistribution and use in source and binary forms, with or without
62322Sdg * modification, are permitted provided that the following conditions
72322Sdg * are met:
82322Sdg * 1. Redistributions of source code must retain the above copyright
92322Sdg *    notice, this list of conditions and the following disclaimer.
102322Sdg * 2. Redistributions in binary form must reproduce the above copyright
112322Sdg *    notice, this list of conditions and the following disclaimer in the
122322Sdg *    documentation and/or other materials provided with the distribution.
132322Sdg * 3. All advertising materials mentioning features or use of this software
142322Sdg *    must display the following acknowledgement:
152322Sdg *	This product includes software developed by the University of
162322Sdg *	California, Berkeley and its contributors.
172322Sdg * 4. Neither the name of the University nor the names of its contributors
182322Sdg *    may be used to endorse or promote products derived from this software
192322Sdg *    without specific prior written permission.
202322Sdg *
212322Sdg * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
222322Sdg * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
232322Sdg * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
242322Sdg * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
252322Sdg * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
262322Sdg * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
272322Sdg * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
282322Sdg * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
292322Sdg * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
302322Sdg * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
312322Sdg * SUCH DAMAGE.
322322Sdg */
33116176Sobrien
34116176Sobrien#include <sys/cdefs.h>
35116176Sobrien__FBSDID("$FreeBSD: head/sys/ddb/db_ps.c 118269 2003-07-31 17:29:42Z jhb $");
36116176Sobrien
372322Sdg#include <sys/param.h>
382322Sdg#include <sys/systm.h>
3974914Sjhb#include <sys/lock.h>
4074914Sjhb#include <sys/mutex.h>
412322Sdg#include <sys/proc.h>
4249558Sphk#include <sys/cons.h>
43108338Sjulian#include <vm/vm.h>
44108338Sjulian#include <vm/vm_param.h>
45108338Sjulian#include <vm/pmap.h>
4612734Sbde
4712734Sbde#include <ddb/ddb.h>
4812734Sbde
49115903Sjhbstatic void	dumpthread(volatile struct proc *p, volatile struct thread *td);
50115903Sjhb
512322Sdgvoid
5210349Sbdedb_ps(dummy1, dummy2, dummy3, dummy4)
5310349Sbde	db_expr_t	dummy1;
5410349Sbde	boolean_t	dummy2;
5510349Sbde	db_expr_t	dummy3;
5610349Sbde	char *		dummy4;
5710349Sbde{
5810128Sdg	volatile struct proc *p, *pp;
5985207Sjhb	volatile struct thread *td;
6099072Sjulian	char *state;
61118269Sjhb	int np, quit;
6210128Sdg
632322Sdg	np = nprocs;
64118269Sjhb	quit = 0;
652322Sdg
6694456Sjhb	/* sx_slock(&allproc_lock); */
6770527Sphk	if (!LIST_EMPTY(&allproc))
6870527Sphk		p = LIST_FIRST(&allproc);
6910128Sdg	else
7010128Sdg		p = &proc0;
7110128Sdg
72118269Sjhb	db_setup_paging(db_simple_pager, &quit, DB_LINES_PER_PAGE);
73101784Sphk	db_printf("  pid   proc     addr    uid  ppid  pgrp  flag   stat  wmesg    wchan  cmd\n");
74118269Sjhb	while (--np >= 0 && !quit) {
7516381Speter		if (p == NULL) {
7616381Speter			printf("oops, ran out of processes early!\n");
7716381Speter			break;
7816381Speter		}
7994456Sjhb		/* PROC_LOCK(p); */
802322Sdg		pp = p->p_pptr;
8110128Sdg		if (pp == NULL)
822322Sdg			pp = p;
8310128Sdg
8499072Sjulian
8599072Sjulian		switch(p->p_state) {
8699072Sjulian		case PRS_NORMAL:
8799072Sjulian			if (P_SHOULDSTOP(p))
88101784Sphk				state = "stop";
8999072Sjulian			else
90115911Sjulian				state = "";
9199072Sjulian			break;
9299072Sjulian		case PRS_NEW:
93101784Sphk			state = "new ";
9499072Sjulian			break;
9599072Sjulian		case PRS_ZOMBIE:
96103216Sjulian			state = "zomb";
9799072Sjulian			break;
9899072Sjulian		default:
99101784Sphk			state = "Unkn";
10099072Sjulian			break;
10199072Sjulian		}
102115911Sjulian		db_printf("%5d %8p %8p %4d %5d %5d %07x %s",
10383383Sjhb		    p->p_pid, (volatile void *)p, (void *)p->p_uarea,
104102667Sbde		    p->p_ucred != NULL ? p->p_ucred->cr_ruid : 0, pp->p_pid,
105102667Sbde		    p->p_pgrp != NULL ? p->p_pgrp->pg_id : 0, p->p_flag,
106102667Sbde		    state);
107116361Sdavidxu		if (p->p_flag & P_SA)
10883383Sjhb			db_printf("(threaded)  %s\n", p->p_comm);
109103216Sjulian		FOREACH_THREAD_IN_PROC(p, td) {
110108338Sjulian			dumpthread(p, td);
111118269Sjhb			if (quit)
112118269Sjhb				break;
1132322Sdg		}
11494456Sjhb		/* PROC_UNLOCK(p); */
11594456Sjhb
11670527Sphk		p = LIST_NEXT(p, p_list);
11710128Sdg		if (p == NULL && np > 0)
11870527Sphk			p = LIST_FIRST(&zombproc);
1192322Sdg    	}
12094456Sjhb	/* sx_sunlock(&allproc_lock); */
1212322Sdg}
122115903Sjhb
123108338Sjulianstatic void
124108338Sjuliandumpthread(volatile struct proc *p, volatile struct thread *td)
125108338Sjulian{
126118228Sjhb
127116361Sdavidxu	if (p->p_flag & P_SA)
128108338Sjulian		db_printf( "   thread %p ksegrp %p ", td, td->td_ksegrp);
129108338Sjulian	if (TD_ON_SLEEPQ(td)) {
130108338Sjulian		if (td->td_flags & TDF_CVWAITQ)
131115911Sjulian			if (TD_IS_SLEEPING(td))
132115911Sjulian				db_printf("[CV]");
133115911Sjulian			else
134115911Sjulian				db_printf("[CVQ");
135108338Sjulian		else
136115911Sjulian			if (TD_IS_SLEEPING(td))
137115911Sjulian				db_printf("[SLP]");
138115911Sjulian			else
139115911Sjulian				db_printf("[SLPQ");
140115911Sjulian		db_printf("%s %p]", td->td_wmesg,
141108338Sjulian		    (void *)td->td_wchan);
142108338Sjulian	}
143108338Sjulian	switch (td->td_state) {
144108338Sjulian	case TDS_INHIBITED:
145108338Sjulian		if (TD_ON_LOCK(td)) {
146108338Sjulian			db_printf("[LOCK %6s %8p]",
147108338Sjulian			    td->td_lockname,
148108338Sjulian			    (void *)td->td_blocked);
149108338Sjulian		}
150115911Sjulian#if 0 /* covered above */
151108338Sjulian		if (TD_IS_SLEEPING(td)) {
152108338Sjulian			db_printf("[SLP]");
153108338Sjulian		}
154115911Sjulian#endif
155108338Sjulian		if (TD_IS_SWAPPED(td)) {
156108338Sjulian			db_printf("[SWAP]");
157108338Sjulian		}
158108338Sjulian		if (TD_IS_SUSPENDED(td)) {
159108338Sjulian			db_printf("[SUSP]");
160108338Sjulian		}
161108338Sjulian		if (TD_AWAITING_INTR(td)) {
162108338Sjulian			db_printf("[IWAIT]");
163108338Sjulian		}
164108338Sjulian		break;
165108338Sjulian	case TDS_CAN_RUN:
166108338Sjulian		db_printf("[Can run]");
167108338Sjulian		break;
168108338Sjulian	case TDS_RUNQ:
169108338Sjulian		db_printf("[RUNQ]");
170108338Sjulian		break;
171108338Sjulian	case TDS_RUNNING:
172113339Sjulian		db_printf("[CPU %d]", td->td_oncpu);
173108338Sjulian		break;
174115904Sjhb	case TDS_INACTIVE:
175115904Sjhb		db_printf("[INACTIVE]");
176115904Sjhb		break;
177108338Sjulian	default:
178115904Sjhb		db_printf("[UNK: %#x]", td->td_state);
179108338Sjulian	}
180116361Sdavidxu	if (p->p_flag & P_SA) {
181108338Sjulian		if (td->td_kse)
182108338Sjulian			db_printf("[kse %p]", td->td_kse);
183108338Sjulian		db_printf("\n");
184108338Sjulian	} else
185108338Sjulian		db_printf(" %s\n", p->p_comm);
186108338Sjulian}
187108338Sjulian
188108338Sjulian
189108338Sjulian#define INKERNEL(va)    (((vm_offset_t)(va)) >= USRSTACK)
190108338Sjulianvoid
191108338Sjuliandb_show_one_thread(db_expr_t addr, boolean_t have_addr,
192108338Sjulian		db_expr_t count, char *modif)
193108338Sjulian{
194108338Sjulian	struct proc *p;
195108338Sjulian	struct thread *td;
196108338Sjulian
197108338Sjulian	if (!have_addr)
198108338Sjulian		td = curthread;
199108338Sjulian	else if (!INKERNEL(addr)) {
200108338Sjulian		printf("bad thread address");
201108338Sjulian		return;
202108338Sjulian	} else
203108338Sjulian		td = (struct thread *)addr;
204108338Sjulian	/* quick sanity check */
205108338Sjulian	if ((p = td->td_proc) != td->td_ksegrp->kg_proc)
206108338Sjulian		return;
207108338Sjulian	printf("Proc %p ",p);
208108338Sjulian	dumpthread(p, td);
209108338Sjulian#ifdef	__i386__
210108338Sjulian	db_stack_thread((db_expr_t)td, 1, count, modif);
211108338Sjulian#endif
212108338Sjulian}
213