diff options
Diffstat (limited to 'sys/ddb/db_ps.c')
-rw-r--r-- | sys/ddb/db_ps.c | 145 |
1 files changed, 93 insertions, 52 deletions
diff --git a/sys/ddb/db_ps.c b/sys/ddb/db_ps.c index bffebe5..b8975b4 100644 --- a/sys/ddb/db_ps.c +++ b/sys/ddb/db_ps.c @@ -38,8 +38,13 @@ #include <sys/mutex.h> #include <sys/proc.h> #include <sys/cons.h> +#include <vm/vm.h> +#include <vm/vm_param.h> +#include <vm/pmap.h> #include <ddb/ddb.h> +static void +dumpthread(volatile struct proc *p, volatile struct thread *td); void db_ps(dummy1, dummy2, dummy3, dummy4) @@ -123,58 +128,7 @@ db_ps(dummy1, dummy2, dummy3, dummy4) if (p->p_flag & P_KSES) db_printf("(threaded) %s\n", p->p_comm); FOREACH_THREAD_IN_PROC(p, td) { - if (p->p_flag & P_KSES) - db_printf( " thread %p ksegrp %p ", td, td->td_ksegrp); - if (TD_ON_SLEEPQ(td)) { - if (td->td_flags & TDF_CVWAITQ) - db_printf("[CVQ "); - else - db_printf("[SLPQ "); - db_printf(" %6s %8p]", td->td_wmesg, - (void *)td->td_wchan); - } - switch (td->td_state) { - case TDS_INHIBITED: - if (TD_ON_LOCK(td)) { - db_printf("[LOCK %6s %8p]", - td->td_lockname, - (void *)td->td_blocked); - } - if (TD_IS_SLEEPING(td)) { - db_printf("[SLP]"); - } - if (TD_IS_SWAPPED(td)) { - db_printf("[SWAP]"); - } - if (TD_IS_SUSPENDED(td)) { - db_printf("[SUSP]"); - } - if (TD_AWAITING_INTR(td)) { - db_printf("[IWAIT]"); - } - if (TD_LENT(td)) { - db_printf("[LOAN]"); - } - break; - case TDS_CAN_RUN: - db_printf("[Can run]"); - break; - case TDS_RUNQ: - db_printf("[RUNQ]"); - break; - case TDS_RUNNING: - db_printf("[CPU %d]", td->td_kse->ke_oncpu); - break; - default: - panic("unknown thread state"); - } - if (p->p_flag & P_KSES) { - if (td->td_kse) - db_printf("[kse %p]", td->td_kse); - db_printf("\n"); - } else - db_printf(" %s\n", p->p_comm); - + dumpthread(p, td); } /* PROC_UNLOCK(p); */ @@ -184,3 +138,90 @@ db_ps(dummy1, dummy2, dummy3, dummy4) } /* sx_sunlock(&allproc_lock); */ } +static void +dumpthread(volatile struct proc *p, volatile struct thread *td) +{ + if (p->p_flag & P_KSES) + db_printf( " thread %p ksegrp %p ", td, td->td_ksegrp); + if (TD_ON_SLEEPQ(td)) { + if (td->td_flags & TDF_CVWAITQ) + db_printf("[CVQ "); + else + db_printf("[SLPQ "); + db_printf(" %6s %8p]", td->td_wmesg, + (void *)td->td_wchan); + } + switch (td->td_state) { + case TDS_INHIBITED: + if (TD_ON_LOCK(td)) { + db_printf("[LOCK %6s %8p]", + td->td_lockname, + (void *)td->td_blocked); + } + if (TD_IS_SLEEPING(td)) { + db_printf("[SLP]"); + } + if (TD_IS_SWAPPED(td)) { + db_printf("[SWAP]"); + } + if (TD_IS_SUSPENDED(td)) { + db_printf("[SUSP]"); + } + if (TD_AWAITING_INTR(td)) { + db_printf("[IWAIT]"); + } + if (TD_LENDER(td)) { + db_printf("[LOAN]"); + } + if (TD_IS_IDLE(td)) { + db_printf("[IDLE]"); + } + if (TD_IS_EXITING(td)) { + db_printf("[EXIT]"); + } + break; + case TDS_CAN_RUN: + db_printf("[Can run]"); + break; + case TDS_RUNQ: + db_printf("[RUNQ]"); + break; + case TDS_RUNNING: + db_printf("[CPU %d]", td->td_kse->ke_oncpu); + break; + default: + panic("unknown thread state"); + } + if (p->p_flag & P_KSES) { + if (td->td_kse) + db_printf("[kse %p]", td->td_kse); + db_printf("\n"); + } else + db_printf(" %s\n", p->p_comm); +} + + +#define INKERNEL(va) (((vm_offset_t)(va)) >= USRSTACK) +void +db_show_one_thread(db_expr_t addr, boolean_t have_addr, + db_expr_t count, char *modif) +{ + struct proc *p; + struct thread *td; + + if (!have_addr) + td = curthread; + else if (!INKERNEL(addr)) { + printf("bad thread address"); + return; + } else + td = (struct thread *)addr; + /* quick sanity check */ + if ((p = td->td_proc) != td->td_ksegrp->kg_proc) + return; + printf("Proc %p ",p); + dumpthread(p, td); +#ifdef __i386__ + db_stack_thread((db_expr_t)td, 1, count, modif); +#endif +} |